以下是一个简单的示例代码,该代码使用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类型的指针。但是,由于这两个进程在不同的虚拟地址空间中运行,因此读进程无法访问写进程中指针指向的地址。因此,尝试访问指针指向的地址将导致异常

用c#写一个demo使用MemoryMappedFile和MemoryMappedViewAccessor在一个进程写IntPtr另一个进程读IntPtr的数据指针内容一致但是读进程的指针指向的地址无数据

原文地址: https://www.cveoy.top/t/topic/dhIE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录