用c#写一个demo使用MemoryMappedFile和MemoryMappedViewAccessor在一个进程写IntPtr另一个进程读IntPtr的数据指针内容一致但是读进程的指针指向的地址无数据
以下是一个简单的示例代码,该代码使用MemoryMappedFile和MemoryMappedViewAccessor在一个进程中写入IntPtr,另一个进程中读取IntPtr的数据。
写进程:
using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
namespace MemoryMappedDemo
{
class Program
{
static void Main(string[] args)
{
// 创建一个内存映射文件
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", Marshal.SizeOf<IntPtr>()))
{
// 在内存映射文件上创建一个视图访问器
using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
{
// 创建一个IntPtr类型的指针
IntPtr ptr = Marshal.AllocHGlobal(sizeof(int));
// 将指针写入内存映射文件
accessor.Write(0, ref ptr);
Console.WriteLine("IntPtr written to memory mapped file.");
Console.ReadLine();
// 释放指针
Marshal.FreeHGlobal(ptr);
}
}
}
}
}
读进程:
using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
namespace MemoryMappedDemo
{
class Program
{
static void Main(string[] args)
{
// 打开一个已存在的内存映射文件
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test"))
{
// 在内存映射文件上创建一个视图访问器
using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
{
// 从内存映射文件中读取IntPtr类型的指针
IntPtr ptr;
accessor.Read(0, out ptr);
Console.WriteLine("IntPtr read from memory mapped file: " + ptr);
// 尝试访问指针指向的地址
try
{
int value = Marshal.ReadInt32(ptr);
Console.WriteLine("Value at IntPtr address: " + value);
}
catch (Exception ex)
{
Console.WriteLine("Error accessing address: " + ex.Message);
}
Console.ReadLine();
}
}
}
}
}
在运行时,写进程将创建一个IntPtr类型的指针,并将其写入内存映射文件。读进程将打开相同的内存映射文件,并从中读取IntPtr类型的指针。但是,由于这两个进程在不同的虚拟地址空间中运行,因此读进程无法访问写进程中指针指向的地址。因此,尝试访问指针指向的地址将导致异常
原文地址: https://www.cveoy.top/t/topic/dhIE 著作权归作者所有。请勿转载和采集!