dllのネイティブなC++関数をマネージドC#コードで使用したいと思います。 しかし、私の関数はstd :: vectorのような引数を取る& - ベクトル参照... どのようにしてこの引数をdllimport文で実装できますか?例えば、IntPtrなどがありますが、std :: vector <の場合はどうなるのでしょうか?C#でネイティブC++コードを使用する - std :: vectorの問題
答えて
私は、必要な機能を包む「C」関数をエクスポートし、C#からP/Invokeをエクスポートします。このような「C」関数は、ポインタとしてのデータとデータバッファのサイズを公開する可能性があります。あなたはクラスBuffer
でstd::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」機能の、幾分些細な、実装の詳細が明らかに読者のための課題として残されている。】
STLベクトルは、アンマネージテンプレート方法です。理論的には、ベクトルの対応するメソッドへのオフセットを計算して、いくつかのコード生成を行い、それを呼び出すことができます。 STLベクトルはエクスポートされたメソッドではないテンプレートのみのライブラリであるため、DllImportは使用できません。もちろん
int GetSize(vector<xxx> *vec)
{
return vec.size();
}
のような特定のメソッドを呼び出すためにCスタイルのラッパーを書くことができますが、このために必要な多くの管理unmanged遷移が突然停止し、アプリケーションをもたらすので、それを行う必要はありません。 stlベクターを操作する必要がある場合は、管理されたC++を使用してC#からManaged C++ dllに呼び出して、好きなようにベクトルを操作することが最善の方法です。多くの企業では、Managed C++の使用が禁止されました。なぜなら、C++にその主な資産であるSpeedが発生する原因となった管理されていないアンマネージドトランジションのコストに人々は注意を払わなかったからです。
ユアーズ、 アロイス・クラウス
- 1. std :: vectorの問題
- 2. C++ std :: vector problems
- 3. sizeof()std :: vector(C++)
- 4. std :: vector abortの問題
- 5. C++のstd :: vectorをstd :: vector <unsigned char>に変換する
- 6. 内部でstd :: vectorやstd :: listを使わないC++ std :: iterator
- 7. fstreamをC++のstd :: vectorにロードする
- 8. C++ 11 std :: vector in concurrent environment
- 9. C++ std :: vector emplace vs insert
- 10. CUDAデバイスコードでstd :: vectorを使用する
- 11. Igraphでstd :: vectorを使用する
- 12. C++のstd :: vectorのArrayListスタイルのindexOf?
- 13. C++コードで行をスキップする問題
- 14. Objective-CコードでObjective-C++インスタンス変数を使用する
- 15. ネイティブC++コードでICollectionインターフェイスを使用する
- 16. C++ std :: vector performance [参照が必要]
- 17. C++ - std :: vectorにオブジェクトを追加する、ループでインスタンス化する
- 18. C#でネイティブDLLを使用する
- 19. C#コードURl問題
- 20. CスタイルのリンクリストとC++のstd :: vectorとの大きな違い
- 21. ExcelのC#コードの問題
- 22. ドロップダウンリストのC#コードの問題
- 23. C++ - std :: vectorの新しいコンストラクタを作成する<double>?
- 24. C++、正しくコピーする方法std :: vector <Class *>コピーコンストラクタで?
- 25. WindowsフォームでのネイティブC++ dllの使用
- 26. std :: vector <std::string>クラッシュ
- 27. C++ 11のstd :: vector :: data()に相当するpriorC++ 11のstd :: vector :: begin()はありますか?
- 28. C#のパラメータとしてstd :: vector <> :: iteratorを使用してアンマネージC++関数を呼び出す方法は?
- 29. std :: vector resize down
- 30. ネイティブC++用のC++/CLIラッパーをC#のリファレンスとして使用する
これはおそらく非常に困難、不可能ではないだろう。あなたの 'C++'ライブラリに 'C'インタフェースを提供して、それを代わりに使用できますか? – ereOn
C++/CLIを使用してラッパークラスを構築します。 –
解決済みのソリューションを使用して必要なものと似たものを実現できますが、正しく理解すれば、アンマネージドDLLとマネージアプリケーションの両方のコードを制御できます。この場合は、dllの関数にC++/CLIラッパーを用意し、C#から直接呼び出すほうが良いでしょう。 STL.Netもご覧ください。ここにプライマーのリンクがあります:http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680