知ってる人からしたら当たり前なのかもですが不思議に思ったのでメモ。
C++/CLIですがアンマネージとの変換はいろいろ手法があります。まぁ文字列型もいろいろあるのでその辺は仕方ないんですが割と低レベルというかCレベルのものと組み合わせる時はconst char*になると思います。で、このconst char*とのやり取りですが.net からであればIntPtr ptr = Marshal::StringToHGlobalAnsi(text); あたりがメジャーかと思います。Marshal::FreeHGlobal(ptr);さえ忘れなければよくあるAnsi(sjis)な文字列との変換はオッケー。
で、タイトルに書いたmarshal_as<>ですがこいつも2008から入ってきたのと他の変換と同じに書けるのもあってモリモリ使ってました。が、こいつですが内部でWideCharToMultiByteを使っていることもあって現在のThreadのコードページの影響をうけます。どういうことかというとSystem:String^な文字列をSJISにしたいなぁって時にふつうのアプリからなら問題ないです。が、ローカライズで英語リソース読むようにCultureを変更するような場合だとSJISじゃなくてコードページ1252みたいなことになっちゃいます。
確かにローカライズで扱う文字も変わるとはいえアプリの本質も通信する先もSJISなのは変わらないので余計なお世話かなぁと感じた次第です。なのでSJISな奴との通信がある場合の変換はmarshal_asじゃなくStringToHGlobalAnsiあたりを使っとくほうが間違いがないと思います。上記挙動って覚えてればいいですがすっかり忘れる気がするので。
以上。あまり役に立たないかもな情報でした。