gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:37 26 4
gpt4 key购买 nike

我需要你的帮助。

我正在尝试将 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 代码。

关于C# 导入 C Dll。结构中的数组指针。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com