2

既存のアンマネージ 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 のようなものは一般的な問題になると思われますが、多くの検索を行った後、このトピックについてはあまり見つかりませんでした。

4

3 に答える 3

2

これらの関数は混合モード プログラミングでのみ必要なため、アセンブリの代わりにいくつかのヘッダー ファイル/スタティック ライブラリにラップします。このようにして、すべてのプログラムでそれらを再利用できますが、エクスポートされることに依存しません。

于 2011-07-18T12:44:28.333 に答える
0

あなたの質問に対する特定の回答ではありませんが、これらの変換関数に関して、あなたのような問題はありません:

        static void StringToStdString ( String ^ s, std::string& os ) 
        {
            using namespace Runtime::InteropServices; 
            const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
            os = chars;
            Marshal::FreeHGlobal(IntPtr((void*)chars));
        }

        static const char * StringToCharPtr ( String ^ s) 
        {
            using namespace Runtime::InteropServices; 
            const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
            return chars;
        }

        static String^ StdStringToString(const std::string& _is)
        {
            return gcnew String(_is.c_str());
        }
于 2011-07-18T12:52:45.787 に答える
-1

DLL 間で C++ 標準ライブラリ クラスを渡すことは、常に悪いニュースです。可能であれば避けてください。

于 2011-07-18T19:52:13.627 に答える