2008-10-16 77 views

回答

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; 
    } 
+0

由于它将信息传递出来,所以优先考虑参考 – JaredPar 2008-10-16 16:48:12

+0

如何将int []转换为IntPtr? – 2008-10-16 16:48:31

1

在这种情况下,您将不得不利用统帅类或不安全。

它也可能只是一个指向数组的指针,所以ref int[] list可能工作。

0

一个int **会和IntPtr的数组,从你的描述我想你可能要考虑使用C++/CLI,以帮助您,例如从非托管INT **到托管数组转换^>^