【发布时间】:2021-05-30 15:42:23
【问题描述】:
我正在编写一个包装 C# DLL 来与供应商提供的用 C 编写的非托管 DLL 进行接口。在大多数情况下,一切都很顺利,但是在提供的文档中有些函数看起来像这样:
int get_value(int unit, int id, int* value)
我的问题是int* value 是一个混合了int 和float 的数组...文档说明了哪个,即第一个值是int,第二个和第三个是float,等等。如果我专门将 DLL value 称为 int 或 float,我会取得一些成功。这会返回一些我正在寻找的数据,但仅限于一种类型。例如,这有点工作:
[DllImport("supplier.dll")]
public static extern int get_value(int unit, int id, float* value)
public static int GetValue(int unit, int id, out float[] value)
{
float[] value = new float[3];
int ret = get_value(unit, id, value);
return ret;
}
value 与 [NaN, value1, value2] 一起返回,因为 0 索引实际上是一个整数并且它没有被正确解释。我尝试使用 IntPtr[] 作为非托管 DLL 中的返回 value,然后使用 Marshal.Copy() 从内存位置获取数据,但这并不顺利。这是一个有前途的方法吗?如果是这样,我不确定要使用哪个重载,举个例子会很有帮助!
【问题讨论】:
-
您可以通过使用
LayoutKind.Explicit(docs.microsoft.com/en-us/dotnet/api/…) 创建struct来创建类似于Cunion的东西。使用这些数组,也许?? -
要么使用显式结构路由,要么只使用
IntPtr(并进行指针数学运算)而不是IntPtr[]。我必须说,这就是我讨厌 C 的原因,这应该被声明为struct*或void*
标签: c# c++ marshalling wrapper dllimport