2010-06-02 50 views
2

我试图写一个包装,这样我的C#应用​​程序可以使用C语言编写的 这里一个DLL的是,我想换一个方法定义:C#包装

void methodA(const uint32_t *data); //c header declaration 

我遇到的问题是想弄清楚如何从c#中提供一个等价的指针。在c#我希望它运行在:

UInt32 data[] //my c# object i want to be able to pass in 

但我如何给我的包装等价的指针?我试过

ref data //my attempt at giving an equivalent pointer to the DLL 

但这似乎没有工作。在DLL中使用调试语句我可以看到,它获得的值不是我想要通过的。

所以我的问题归结为我有正确的包装ac函数使用指针引用一个数组?

回答

3

一个数组已经是一个引用,所以它将被编组为一个指向它的指针。这应该工作:

[DllImport("my.dll")] 
static extern void methodA(UInt32[] data); 

如果需要回数据传递到托管代码,你需要装饰与Out attribute参数:

[DllImport("my.dll")] 
static extern void methodA([In, Out] UInt32[] data); 

用法:

uint[] data = new uint[] { 1, 2, 3, 4, 5 }; 
methodA(data); 
Console.WriteLine(data[0]); 

另一种解决方案是声明该参数为IntPtr类型:

[DllImport("my.dll")] 
static extern void methodA(IntPtr data); 

为了做到这一点,您需要固定数组以获取IntPtr,或者在非托管空间中分配内存并将数组内容复制到其中。不过,我不会推荐这些选项。

[DllImport("my.dll")] 
static extern void methodB(ref UInt32 data); 
1

P中声明用了methodA的IntPtr参数/调用的声明:如果你想通过引用传递值类型的单个值


ref是必需的。要将UInt32阵列转换为非托管阵列,请使用Marshal.Copy Method (Int32[], Int32, IntPtr, Int32)。从这篇文章

代码示例是给你的好,叫这个了methodA行后:

Marshal.Copy(managedArray, 0, pnt, managedArray.Length); 
// now call methodA with pmt parameter