2011-02-07 19 views
5

dllのネイティブなC++関数をマネージドC#コードで使用したいと思います。 しかし、私の関数はstd :: vectorのような引数を取る& - ベクトル参照... どのようにしてこの引数をdllimport文で実装できますか?例えば、IntPtrなどがありますが、std :: vector <の場合はどうなるのでしょうか?C#でネイティブC++コードを使用する - std :: vectorの問題

+1

これはおそらく非常に困難、不可能ではないだろう。あなたの 'C++'ライブラリに 'C'インタフェースを提供して、それを代わりに使用できますか? – ereOn

+2

C++/CLIを使用してラッパークラスを構築します。 –

+1

解決済みのソリューションを使用して必要なものと似たものを実現できますが、正しく理解すれば、アンマネージドDLLとマネージアプリケーションの両方のコードを制御できます。この場合は、dllの関数にC++/CLIラッパーを用意し、C#から直接呼び出すほうが良いでしょう。 STL.Netもご覧ください。ここにプライマーのリンクがあります:http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680

答えて

5

私は、必要な機能を包む「C」関数をエクスポートし、C#からP/Invokeをエクスポートします。このような「C」関数は、ポインタとしてのデータとデータバッファのサイズを公開する可能性があります。あなたはクラスBufferstd::vector<byte_t>を持っていることを例えば

セイ:

class Buffer 
{ 
public: 
    const std::vector<byte_t>& GetData() const { return data_; } 

private: 
    std::vector<byte_t> data_; 
}; 

次に、あなたが適切にスコープ使用したいBufferに「C」機能をエクスポートすることができます。

Buffer* CreateBuffer(); 

そして、おそらく、std::vector<byte_t>にデータを書き込むネイティブ側で何かしたいと思うでしょう:

void DoSomethingThatProduceData(Buffer* buffer); 

次にあなたがそのデータを読み取ることができます。

void GetBufferData(const Buffer* buffer, const byte_t** data, int* size); 

そして最後に、クリーンアップ:

void DestroyBuffer(Buffer* buffer); 

は、C#側のP /呼び出しのものにそれらの "C" 宣言を翻訳

[DllImport("YourBufferLib.dll")] 
static extern IntPtr CreateBuffer(); 

[DllImport("YourBufferLib.dll")] 
static extern void DoSomethingThatProduceData(IntPtr buffer); 

[DllImport("YourBufferLib.dll")] 
static extern void GetBufferData(IntPtr buffer, out IntPtr data, out Int32 size); 

[DllImport("YourBufferLib.dll")] 
static extern void DestroyBuffer(IntPtr buffer); 

ネイティブリソースが適切に機能することを保証するIDisposableクラスの管理サイドでこれらの呼び出しをラップするのは良いことです育った。

[「C」機能の、幾分些細な、実装の詳細が明らかに読者のための課題として残されている。】

0

STLベクトルは、アンマネージテンプレート方法です。理論的には、ベクトルの対応するメソッドへのオフセットを計算して、いくつかのコード生成を行い、それを呼び出すことができます。 STLベクトルはエクスポートされたメソッドではないテンプレートのみのライブラリであるため、DllImportは使用できません。もちろん

int GetSize(vector<xxx> *vec) 
{ 
    return vec.size(); 
} 

のような特定のメソッドを呼び出すためにCスタイルのラッパーを書くことができますが、このために必要な多くの管理unmanged遷移が突然停止し、アプリケーションをもたらすので、それを行う必要はありません。 stlベクターを操作する必要がある場合は、管理されたC++を使用してC#からManaged C++ dllに呼び出して、好きなようにベクトルを操作することが最善の方法です。多くの企業では、Managed C++の使用が禁止されました。なぜなら、C++にその主な資産であるSpeedが発生する原因となった管理されていないアンマネージドトランジションのコストに人々は注意を払わなかったからです。

ユアーズ、 アロイス・クラウス

関連する問題