2

私は C# を持っており、array<System::Byte>それを C++ に変換したいと考えていますbyte*。どうやってやるの?同じプロジェクトでマネージ コードとアンマネージ コードを使用できるため、C++/CLR を使用しています。私は基本的に DLL を作成し、C# 経由で呼び出すことができるいくつかのメソッドを作成していますが、それらにはアンマネージ C++ コードが含まれています。

基本的に、私の C++/CLR メソッド ヘッダーは次のとおりです。

void testMethod(array<Byte>^ bytesFromCSharp);

その中で、を他のアンマネージ C++ コードで使用できるに変換しtestMethodたいと思います。私は配列をmallocし、forループを書いてバイトごとにコピーしましたが、もっと良い解決策があるはずです。bytesFromCSharpbyte*byte*

編集:以下の彼の答えからのハンスのテクニックの例:

//C#
byte[] myBytes = {1,2,3,4};

//C++/CLI
void testMethod(array<byte>^ myBytes) {
    pin_ptr<byte> thePtr = &myBytes[0];
    byte* bPtr = thePtr;
    nativeCode(bPtr);
    ...
}
4

1 に答える 1

6

pin_ptr<> テンプレート クラスを使用して配列を固定し、ネイティブ コードで使用できるポインターを生成します。ピニングすると、ネイティブ コードが配列を使用している間、ガベージ コレクターが配列を移動できなくなります。

pin_ptr<> 変数が範囲外になった後、ネイティブ コードが配列を使用できないことを確認してください。これは、後で使用するためにポインターを格納するネイティブ コードが適切ではないことも意味します。その場合はコピーを作成する必要があります。

于 2013-07-17T00:34:11.823 に答える