在应用程序A中,一个整数被写入内存。全局内存访问
var intBytes = BitConverter.GetBytes(123);
var allocatedMemory = Marshal.AllocHGlobal(intBytes.Length);
Marshal.Copy(intBytes, 0, allocatedMemory, intBytes.Length);
指针然后发送到应用程序B,在该应用程序中整数被再次读取。
byte[] buffer = new byte[Marshal.SizeOf<int>()];
Marshal.Copy(allocatedMemory, buffer, 0, buffer.Length);
var myRecievedInteger = BitConverter.ToInt32(buffer, 0);
的问题是,应用B是得到一个错误的随机值和有时候在App B中的Marshal.Copy
方法抛出System.AccessViolationException
。
- 使用
AllocCoTaskMem
方法不会改变任何东西。 - 设置像
4
这样的内存的固定大小也没有帮助。 - 指针在两个应用程序中都是相同的。
- App B中的读取缓冲区包含错误的数据。 (不是123,0,0,0)
有人知道我在做什么错吗?
进程不共享内存。编组是为了缩小托管和非托管内存之间的差距。进程之间不共享托管和非托管内存。为了在进程之间进行通信,有各种技术。您可以使用该文件系统作为最简单和最基本的。您也可以使用命名管道或WCF。 –
共享内存也是一种可用的技术 –
我试图发送一个结构与'lParam'参数通过'SendMessage'函数从user32.dll到另一个进程。他们不是使用相同的技术吗? – NtFreX