7

ここで私の最初の質問:)

C# で記述されたフロント エンド UI を持つ C++ (ゲームのマップ エディター) で記述されたアプリケーションを使用しています。私はC#が初めてなので、C++側でできるだけ多くのことをしようとしています.

C# から、単純な変数型 (int および string) を持つ構造体のリストを返す C++ 関数を呼び出して、UI にある listBox にデータを入力できるようにします。これは可能ですか?C# で dll インポート関数をどのように記述すればよいですか?

ここで答えを探してみましたが、C# から C++ にリストを渡す方法に関する投稿しか見つかりませんでした。

C++ コード:

struct PropData
{
PropData( const std::string aName, const int aId )
{
    myName = aName;
    myID = aId;
}

std::string myName;
int myID;
};

extern "C" _declspec(dllexport) std::vector<PropData> _stdcall GetPropData()
{
std::vector<PropData> myProps;

myProps.push_back( PropData("Bush", 0) );
myProps.push_back( PropData("Tree", 1) );
myProps.push_back( PropData("Rock", 2) );
myProps.push_back( PropData("Shroom", 3) );

return myProps;
}

C# インポート関数:

    [DllImport("MapEditor.dll")]
    static extern ??? GetPropData();

編集:

Ed S からの投稿の後、C++ コードを struct PropData { PropData( const std::string aName, const int aId ) { myName = aName; } に変更しました。myID = aId; }

    std::string myName;
    int myID;
};

extern "C" _declspec(dllexport) PropData* _stdcall GetPropData()
{
    std::vector<PropData> myProps;

    myProps.push_back( PropData("Bush", 0) );
    myProps.push_back( PropData("Tree", 1) );
    myProps.push_back( PropData("Rock", 2) );
    myProps.push_back( PropData("Shroom", 3) );

    return &myProps[0];
}

そして C# を [DllImport("MapEditor.dll")] static extern PropData GetPropData(); に

    struct PropData
    {
        string myName;
        int myID;
    }

    private void GetPropDataFromEditor()
    {
        List<PropData> myProps = GetPropData();
    }

もちろん、GetPropData() はリストに変換されるものを何も返さないため、これはコンパイルされません。

Ed S. さん、私をここまで連れてきてくれてありがとう!

4

1 に答える 1

9

std::vectorを C# 領域にマーシャリングすることはできません。代わりにすべきことは、配列を返すことです。基本的な型に固執することで、相互運用の状況に直面したときに物事がより簡単になります。

std::vector&v[0] が最初の要素を指し、すべての要素が連続して格納されることが保証されるため、配列を返すだけです。そのままの C++ インターフェースに行き詰っている場合 (そうではないと思います)、COM などのより複雑なメカニズムを検討する必要があります。

于 2012-01-18T17:46:35.783 に答える