C# 具有内存映射文件的共享内存 我创建了两个应用程序:一个C语言,一个C++程序,我想在两个应用程序之间使用共享内存来进行IPC。对于共享内存,我使用内存映射文件

C# 具有内存映射文件的共享内存 我创建了两个应用程序:一个C语言,一个C++程序,我想在两个应用程序之间使用共享内存来进行IPC。对于共享内存,我使用内存映射文件,c#,c++,memory-management,shared-memory,memory-mapped-files,C#,C++,Memory Management,Shared Memory,Memory Mapped Files,C#应用程序将创建MemoryMappedFile并向其中写入数据: using System; using System.IO; using System.IO.MemoryMappedFiles; using System.Threading; namespace Test { class Program { static void Main(string[] args) { using (MemoryMappedFi

C#应用程序将创建MemoryMappedFile并向其中写入数据:

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Threading;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("testmap", 256))
            {
                using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                {
                    BinaryWriter writer = new BinaryWriter(stream);
                    writer.Write("Hello, world!");
                }
            }

            Console.ReadKey();
        }
    }
}

C++应用程序将读取共享内存的值:

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")

#define BUF_SIZE 256
TCHAR szName[] = TEXT("testmap");

int _tmain()
{
    HANDLE hMapFile;
    LPCTSTR pBuf;

    hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,   // read/write access
        FALSE,                 // do not inherit the name
        szName);               // name of mapping object

    if (hMapFile == NULL)
    {
        _tprintf(TEXT("Could not open file mapping object (%d).\n"),
            GetLastError());
        return 1;
    }

    pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
        FILE_MAP_ALL_ACCESS,  // read/write permission
        0,
        0,
        BUF_SIZE);

    if (pBuf == NULL)
    {
        _tprintf(TEXT("Could not map view of file (%d).\n"),
            GetLastError());

        CloseHandle(hMapFile);

        return 1;
    }

    MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

    UnmapViewOfFile(pBuf);

    CloseHandle(hMapFile);

    return 0;
}
#包括
#包括
#包括
#包括
#pragma注释(lib,“user32.lib”)
#定义BUF_大小256
TCHAR szName[]=文本(“测试地图”);
int_tmain()
{
处理hMapFile;
LPCTSTR-pBuf;
hMapFile=OpenFileMapping(
文件映射所有访问权限,//读/写访问权限
FALSE,//不继承名称
szName);//映射对象的名称
if(hMapFile==NULL)
{
_tprintf(文本(“无法打开文件映射对象(%d)。\n”),
GetLastError());
返回1;
}
pBuf=(LPTSTR)MapViewOfFile(hMapFile,//映射对象的句柄
文件\u映射\u所有\u访问,//读/写权限
0,
0,
大小);
if(pBuf==NULL)
{
_tprintf(文本(“无法映射文件(%d)的视图)。\n”),
GetLastError());
CloseHandle(hMapFile);
返回1;
}
MessageBox(NULL、pBuf、文本(“进程2”),MB_OK);
未经批准的文件(pBuf);
CloseHandle(hMapFile);
返回0;
}

首先,我将运行C++应用程序创建共享内存,然后运行C++应用程序从共享内存读取数据。但是我在C++应用程序中遇到了异常:“无法打开文件映射对象(2)”。是因为.NET中内存映射文件与我在这里使用的C++内存映射文件不兼容吗?如果是这样的话,有没有我可以用来在C++和C语言应用程序之间共享内存的库?或者我在代码的某个地方出错了

更新:


这是我的C代码中的一个bug,Console.ReadKey()应该在using块中!感谢塞维林。

你说的“创造”是什么意思?在你的c#示例中,它是在
中使用的
,所以当你到达
ReadKey
时,我认为你的映射消失了,被破坏了。@Severin,你是对的!嗯,真是个愚蠢的错误,谢谢你,伙计。