c# - 将结构编码(marshal)到指针时出现 "Attempted to read of write protected memory..."错误

标签 c# pinvoke marshalling unmarshalling

我正在测试一个简单的概念,我有一个名为 ChatMessage 的结构,它包含 2 个字节数组(MessageText 长度为 512,UserName 长度为 32)和一个 DateTime。我将字符串参数传递给 ChatMessage 构造函数并将它们转换为字节数组,然后设置 DateTime。在构建对象后,我这样做:

ChatMessage chat = new ChatMessage("Message", "Username");
IntPtr m = Marshal.AllocHGlobal(Marshal.SizeOf(chat));
Marshal.StructureToPtr(chat, m, true);
SendMessage(...);
Marshal.FreeHGlobal(m);

看起来应该很简单。创建结构的实例,将其编码到非托管内存并获取指针。我这样做是为了可以使用 Windows 消息将它传递给另一个程序。问题是,每当它到达 StructureToPtr() 行时,它都会抛出一个 AccessViolationException,指出我“试图读取或写入 protected 内存......”。我不知道我到底做错了什么。我知道我以前做过这个,但我找不到我做过的项目。

我只是想将结构编码到非托管内存并将指向它的指针传递给另一个程序,然后将其编码到托管内存并读取它。结构定义存在于两个项目中,所以这不是问题。

最佳答案

您正在使用 StructureToPtr 将数据从托管代码编码到非托管代码。如上所述,这不适用于跨进程。

您正在寻找一种通过网络跨进程或跨机器序列化和发送“脱水”对象的方法。看看 MSDN Serialization content . Codeproject 也有一篇关于此的好文章 (http://www.codeproject.com/KB/cs/objserial.aspx)。

这应该可以帮助您入门。当然,如果您希望在大规模/高性能场景中传输此类数据,您可能希望查看类似 Protocol Buffer for .NET 的内容。或其他现代序列化框架。

关于c# - 将结构编码(marshal)到指针时出现 "Attempted to read of write protected memory..."错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348924/

相关文章:

c# - 使用 C# SMTP API 时如何从 SES 获得响应

c# - 如何使用 open xml sdk 在 .xlsx 文件的现有行中添加新单元格?

c# - 将 C Union 转换为 C#(未正确对齐)

c# - 从数据库中保存/检索/比较 CheckboxList 值

c# - 在 C# 中继承 List<> 并覆盖构造函数

c# - Delphi 记录转换为 C# 结构并写入套接字

c# - 平台调用 #define 指令

json - 在 Go 中将 JSON 解码为自定义格式

c# - 如何导入带有 int** 和 double** 参数的 C++ 函数

c# - IntPtr 到字节数组并返回