繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM