2012-01-18 14 views
7

私の最初の質問はここにあります:)C++からC#にオブジェクトのリストを渡すには?

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

C#から私は単純な変数型(intとstring)を持つ構造体のリストを返すC++関数を呼び出したいので、リストボックスにUIを持たせることができます。これは可能ですか?どのように私は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(); 

EDIT:

エドS.から投稿した後、私は 構造体PropData にC++コードを変更{ 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")] 静的にextern PropData GetPropData()。

struct PropData 
    { 
     string myName; 
     int myID; 
    } 

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

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

私はこれまでに私を得るために多くのエドS.ありがとう!

答えて

9

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

std::vectorは、& v [0]が最初の要素を指し、すべての要素が連続して格納されていることを保証します。あなたがC++インターフェイスをそのまま使用していると(私はあなたがそうではないと思う)、COMのようなもっと複雑なメカニズムを調べなければなりません。

+0

構造体も使用できませんでしたか?もちろん、すべてのことを1つの言語で行うのは簡単です。フロントエンドがC#で書かれているなら、C#ですべてを行うことができるはずです。 –

+0

クイックレスポンスありがとうございますが、私は(私はちょうど今日始めた)言語に新しいだと私はそれがポインタを処理することができるのか分からなかったとC#の構文でより多くの助けが必要です。 – Cousken

+0

@Ramhound: 'std :: vector'をまるっきり模倣したC#構造体をどうやって作ることができるかわかりません。これはPODタイプでのみ機能します。 –

関連する問題