5

我正在尝试使用第三方 DLL,它需要一个 int** 作为该方法的参数之一。它将参数描述为指向内存分配的指针的地址。

很抱歉有任何混淆。我认为参数是双向的。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 回答