我正在尝试编写一个包装器,以便我的 C# 应用程序可以使用用 C 编写的 DLL。 这是我试图包装的方法定义:
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 中的调试语句,我可以看到以这种方式获取的值不是我试图传入的值。
所以我的问题归结为我是否正确包装使用指针引用数组的 c 函数?
最佳答案
数组已经是一个引用,因此它将被编码为指向它的指针。这应该有效:
[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,或者在非托管空间中分配内存并将数组内容复制到其中。不过,我不会推荐这些选项。
如果您想通过引用传递值类型的单个值,则需要
ref
:
[DllImport("my.dll")]
static extern void methodB(ref UInt32 data);
关于C# DLL 的包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957864/