5

メソッドのパラメーターの 1 つとして int** を必要とするサード パーティの DLL を使用しようとしています。パラメータは、メモリ割り当てを指すポインタのアドレスとして記述されます。

混乱して申し訳ありません。パラメータは双方向だと思います。DLL は FPGA ボードと対話するためのもので、メソッドはホスト PC と PCI ボード間の DMA 転送をセットアップすることです。

4

3 に答える 3

7

by-ref を使用しSystem.IntPtrます。

 [DllImport("thirdparty.dll")]
 static extern long ThirdPartyFunction(ref IntPtr arg);

 long f(int[] array)
  { long retval = 0;
    int  size   = Marshal.SizeOf(typeof(int));
    var  ptr    = IntPtr.Zero;

    try 
     { ptr = Marshal.AllocHGlobal(size * array.Length);

       for (int i= 0; i < array.Length; ++i) 
        { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
          Marshal.StructureToPtr(array, tmpPtr, false);
        }

       retval = ThirdPartyFunction(ref ptr);
     }
    finally 
     { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
     }

    return retval;
  }
于 2008-10-16T16:14:09.373 に答える
1

この場合、Marshal クラスを使用するか、危険にさらす必要があります。

また、配列へのポインターである可能性もあるため、 aref int[] listが機能する可能性があります。

于 2008-10-16T16:14:37.950 に答える
0

int** は IntPtr の配列になります。あなたの説明から、C++/CLI を使用して、たとえばアンマネージ int** からマネージ配列への変換を支援することを検討したいと思うかもしれません^> ^

于 2008-10-16T17:11:44.950 に答える