C#import C Dll。 struct中的数组指针。如何?

时间:2010-12-19 19:07:03

标签: c# c struct

我需要你的帮助。

我正在尝试将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的测试函数。宽度和高度都是正确的。但数据都错了。

我在哪里犯错?

2 个答案:

答案 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;
}