1

私は C++ ライブラリを持っています。そのヘッダーは次のようになります。

void NotMyFun(double * a, int * b);

この関数は から読み取りa、 に書き込みますb。ライブラリを呼び出すために、以下の関数が定義されている C++/CLI ラッパーを作成しました。

static void MyWrapperFun(double * a, int * b)
{
    NotMyFun(a,b);
}

そして正常に動作します。C# コードから、たとえば と という 2 つのマネージ配列がdouble[] maありdouble[] mb、そこにmaは意味のあるデータが既に保持されておりmb、ラッパーが呼び出されると意味のあるデータが入力されます。以下は、ラッパー関数を呼び出すための適切な方法ですか?

unsafe
{
    fixed (double* pma = ma)
    {
        fixed (int* pmb = mb)
        {
            MyWrapperNS.MyWrapperClass.MyWrapperFun(pma,pmb);
        }
    }
}

安全でないポインターは速い方法ですか? C++/CLI ラッパーとの間で受け渡しを行う際にデータのコピーは必要ですか? または、ポインターは既に C# 配列の連続したメモリ空間を指していますか?

その上、ここで手動のメモリクリーニングが必要ですか? ポインターがマネージ C# 配列のメモリに関連付けられている場合、それらは後で適切にガベージ コレクションされると思いますが、確認したいだけです。

4

1 に答える 1

2

個人的には、物事を複雑にしすぎていると思います。安全でないコードを避け、C++/CLI レイヤーをスキップします。次のように宣言された単純な p/invoke を使用します。

[DllImport(@"mylib.dll")]
static extern void NotMyFun(double[] a, int[] b);

doubleintは blittable 型であるため、コピーは必要ありません。マーシャラーは、呼び出しの間、配列を固定するだけです。

于 2012-12-27T17:51:52.123 に答える