Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DLLImport Int**-如果可以,如何执行此操作_C#_Interop_Pinvoke_Dllimport - Fatal编程技术网

C# DLLImport Int**-如果可以,如何执行此操作

C# DLLImport Int**-如果可以,如何执行此操作,c#,interop,pinvoke,dllimport,C#,Interop,Pinvoke,Dllimport,我正在尝试使用第三方DLL,它希望int**作为方法的参数之一。它将参数描述为指向内存分配的指针的地址 对不起,有什么困惑。我认为这个参数是双向的。DLL用于与FPGA板对话,方法是在主机PC和PCI板之间设置DMA传输。使用by ref [DllImport(“thirdparty.dll”)] 静态外部长第三方功能(参考IntPtr参数); 长f(int[]数组) {long retval=0; int size=Marshal.SizeOf(typeof(int)); var ptr=In

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

对不起,有什么困惑。我认为这个参数是双向的。DLL用于与FPGA板对话,方法是在主机PC和PCI板之间设置DMA传输。

使用by ref

[DllImport(“thirdparty.dll”)]
静态外部长第三方功能(参考IntPtr参数);
长f(int[]数组)
{long retval=0;
int size=Marshal.SizeOf(typeof(int));
var ptr=IntPtr.Zero;
尝试
{ptr=Marshal.AllocHGlobal(size*array.Length);
for(int i=0;i
在这种情况下,您必须使用封送处理类,否则将变得不安全


它也可能只是一个指向数组的指针,因此
ref int[]list
可能会起作用。

一个int**可能是一个IntPtr的数组,根据您的描述,我想您可能想研究一下如何使用C++/CLI来帮助您进行转换,例如从非托管int**到托管数组^>^

如何转换int[]到IntPtr?使用ref 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;
  }