c# - C# 保护内存的问题

标签 c# c++ pinvoke

我正在 PInvoking native C++ DLL。实际上我已经完成了两次(两个不同的 C# 程序,两个不同的 C++ 程序)。两次我都在 C# 端创建内存。两次我都使用了相当复杂的编码结构,我通过 ref 发送。

但是,我的一个程序运行得很好。

另一个运行直到 native C++ 尝试从发送的数据中读取值。但随后爆炸,我遇到了读/写保护内存错误?

我不明白使用同一个 Visual Studio 构建的两个程序如何导致一个让我访问内存而另一个被禁止。

我检查了设置,两者在项目设置中几乎完全相同?

在我遇到问题的项目中,我什至将发送的数据减少到一个精确大小的结构,如下所示:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
struct Shared2_s
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
    public byte[] filler2;
    //40
}

最佳答案

如果您需要 Shared2_s 实例的生命周期长于仅调用 native 方法,则需要在非托管内存中分配它并在完成后再次清理它。

var pointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Shared2_s)));
var inst = new Shared2_s();
Marshal.StructureToPtr(inst, pointer, false);
...
MyNativeMethod(pointer);
...
Marshal.FreeHGlobal(pointer);

应调整 MyNativeMethod 的 DllImport 声明,使其不再采用 ref Shared2_s 参数,而是采用 IntPtr

只有在确定没有其他 native 代码会尝试访问分配的内存后,您才应调用 FreeHGlobal。

关于c# - C# 保护内存的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183258/

相关文章:

c# - 与 GO 共享 .Net 库

c# - 根据屏幕大小更改标签大小 xamarin forms

c# - 绑定(bind)工作正常,但智能感知显示 : Cannot resolve property XXX in data context of type 'object'

c++ - boost asio 服务队列深度和策略

c++ - 对 2 组不同的数组进行排序

c# - pinvoke c 函数 - System.BadImageFormatException

c# - 将指针编码到字符串数组

c# - 为什么给int赋一个大于int的值默认不会抛出异常?

c# - 通过 ODBC 查询系统间缓存

c++ - 在 friendlyarm qtopia 错误上编译