我正在 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/