我正在创建两个应用程序:一个在C#中,一个在C ++中,我想在两个应用程序之间使用共享内存用于IPC。对于共享内存,我使用了Memory-Mapped File。
C#app将创建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;
}
首先,我将运行C#app创建共享内存,然后运行C ++ app从共享内存中读取数据。但我在C ++应用程序中遇到异常:“无法打开文件映射对象(2)”。是因为.net中的内存映射文件与我在这里使用的C ++内存映射文件不兼容吗?如果是这样,我可以使用任何库来共享C ++和C#应用程序之间的内存吗?或者我在代码中的哪个地方犯了错误?
Upadted:
这是我的C#代码中的一个错误,Console.ReadKey()应该在using块中!感谢Severin。