我有一个用 C 编写的 dll,它被导入到 C# 应用程序中。我需要从 dll 中读取一些硬件设备的值,实际读取过程由 C dll 中的函数完成。 现在我想用这个函数读出所有值,并以快速简单的方式将它们返回给 C#。 它是一个非常“通用”的多平台 C 库,由一些函数组成,用于处理与所述硬件设备的通信。我正在寻找不必特定于我的案例的通用“C 到 C#”答案。
我在 C 和 C# 方面不是很有经验,这使得任务相当复杂(我无法选择语言)。 在 C 中执行此操作的明智方法是什么?如何在 C 中声明它以及如何在 C# 中正确导入它?
这里有一些伪代码可以让我的问题更清楚一些。那不是有效的代码,但应该弄清楚我在做什么 C:
int [] read(){
int results [3];
results[0] = getPosition();
results[1] = getOrientation();
results[2] = getTouch();
return results;
}
C#
[DllImport("myDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int[] read();
int [] cReturn = new int[3];
cReturn = read();
我尝试返回一个 int 数组并在 C# 中编码(marshal)它,因为我所有的值都是 int 类型,但返回数组似乎不是你在 C 中会做的事情。
我找到了很多 C++ 的示例,但没有一个适用于 C,因为它们使用了 C++ 特定的函数。
最佳答案
您可以让您的 C API 将值设置为作为参数传递的指针,即:
void your_c_function(int* value1, int* value2)
{
*value1 = 42;
*value2 = 43;
}
然后您可以通过 ref
进行 PInvoke:
[DllImport("your_dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int your_c_function(ref int value1, ref int value2);
请注意,如果要设置的值很多,您还可以在 C 中定义一个 struct
,并通过指针传递整个结构。但是,这将需要在托管端重新创建结构定义。
关于c# - C dll向C#返回多个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22001898/