[英]C# import C Dll. Array pointer in struct. How to?
我需要你的帮助。
我正在尝试将C Dll导入C#项目。 这样做时,我需要在两个方向的Dll和C#项目之间传递一个结构。
这是C的定义:
struct mwBITMAP
{
int bmWidth;
int bmHeight;
BYTE* bmData;
};
这是C#定义:
[StructLayout(LayoutKind.Sequential)]
public struct MwRemoteBmp
{
public int Width;
public int Height;
public byte[] Data;
}
我试图通过引用将C#的结构(数据已正确初始化)传递给dll的测试函数。 宽度和高度都正确。 但是数据全错了。
我在哪里犯错?
是的,该阵列被封为SAFEARRAY。 不撞掉pinvoke编组员是很不寻常的。 将Data成员声明为IntPtr,然后使用Marshal.Copy()复制数据。
注意,这在C语言中也很难使用。 存在内存管理问题,尚不清楚谁拥有该阵列。 最典型的是,C函数将使用malloc()分配数组。 这是一个大问题,您无法在C#中释放该数组,无法调用free()。 您将发生无法插拔的内存泄漏。 如果您不能重写C代码,则需要用C ++ / CLI语言编写包装器,以便可以调用free()。 如果C dll不使用与C ++ / CLI代码相同的CRT,则即使这很棘手。 您必须使用/ MD选项编译C代码。
使用IntPtr类型而不是byte []类型。 在您的示例中:
[StructLayout(LayoutKind.Sequential)]
public struct MwRemoteBmp
{
public int Width;
public int Height;
public IntPtr Data;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.