既存のアンマネージ C++ ライブラリをラップする C++/CLI を書いていると、マネージ型からアンマネージ型への変換の問題が発生しました。これの簡単な例は、std::string を System::String に変換することですが、原則は多くの型、つまり配列 -> ベクトルに適用されます。いくつかの変換関数を作成したので、それらを再利用できるようにアセンブリにパッケージ化することにしました。グローバル C++/CLI 関数が現在のアセンブリの外では見えないことを考えると、私はこのようなものになりました
public ref class ClassJustToContainStaticFunctions
{
public:
static std::string convert( System::String^ s )
{
msclr::interop::marshal_context context;
return( context.marshal_as<std::string>( s ) );
}
};
これは問題なく準拠していますが、convert 関数は署名でアンマネージ型を使用しているため、アセンブリの外部で公開されません。こちらを参照してください。詳細については、 100%29.aspxを参照してください。解決策は通常追加することです
#pragma make_public(std::string)
ファイルに追加し、他の状況では問題なくこれを実行しました。ただし、make_public は std::string のようなテンプレート化されたクラスでは機能しません。詳細については、 http://msdn.microsoft.com/en-us/library/ms235343%28v=vs.80%29.aspxを参照してください。
たとえば、いくつかの回避策を見つけましたが、それらはすべてかなり醜いようでした。
結局のところ、私の質問は、ここで明らかな何かが欠けているのでしょうか? マネージド型からアンマネージド型への変換、特にコンテナー クラス、つまり STL.NET <--> Unmanged STL のようなものは一般的な問題になると思われますが、多くの検索を行った後、このトピックについてはあまり見つかりませんでした。