C# DLL 的包装器

标签 c# c arrays dll wrapper

我正在尝试编写一个包装器,以便我的 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/

相关文章:

arrays - 在 Google 表格中,如何仅显示一个变量的分组条形图?

C 具有无限输入的匹配模式

PHP 计数数组列

c# - 使用 OleDbCommand/OleDbDataAdapter 读取 CSV 文件

C# WPF - 动态 TabControl 中的滚动条

c - 为什么指针不在栈上?

c - 在c中按索引偶数或奇数将数组拆分为两个数组

java - ArrayList 和 java.lang.OutOfMemoryError

C# 符号理解 Select(int.Parse)

c# - 如何模拟从另一个模拟作为属性返回的接口(interface)?