我需要你的帮助。
我正在尝试将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的测试函数。宽度和高度都是正确的。但数据都错了。
我在哪里犯错?
答案 0 :(得分:3)
是的,数组被封送为SAFEARRAY。没有崩溃的pinvoke marshaller是非常不寻常的。将Data成员声明为IntPtr,然后使用Marshal.Copy()复制数据。
请注意,这在C中也很难使用。存在内存管理问题,目前尚不清楚谁拥有该阵列。最典型的是,C函数将使用malloc()来分配数组。这是一个大问题,你无法在C#中释放该数组,无法调用free()。你将有一个不可插拔的内存泄漏。如果你不能重写C代码,那么你需要用C ++ / CLI语言编写一个包装器,这样你就可以调用free()。如果C dll不使用与C ++ / CLI代码相同的CRT,那么即使这样也很棘手。您必须使用/ MD选项编译C代码。
答案 1 :(得分:2)
使用IntPtr类型而不是byte []类型。 在您的示例中:
[StructLayout(LayoutKind.Sequential)]
public struct MwRemoteBmp
{
public int Width;
public int Height;
public IntPtr Data;
}