猿问
下载APP

如何在.NET中实现共享内存?

如何在.NET中实现共享内存?

我有一个C ++ .NET应用程序和一个C#.NET应用程序。我希望他们通过共享内存进行通信。

.NET版本2.0怎么可能?

主要是想共享一个队列对象。


慕盖茨4494581
浏览 53回答 3
3回答

三国纷争

使用C ++ / CLI,按照普通的C ++ API(C ++ / CLI能够与托管和本机HEAP /内存引用进行交互)设置共享内存非常容易。然后可以使用UnmanagedMemoryStream将Stream对象公开给C#。我没有附加.h文件,但你可以相当容易地推断出pmapped native typedef的布局;)。您可能还想根据读者/编写器用例评估BufferedStream的可能用途。代码来自一个我不再使用的项目,所以我不记得它的bug回归的状态。这是C ++ / CLI类,它建立文件映射并公开UnmanagedMemoryStream;public&nbsp;ref&nbsp;class&nbsp;MemMapp{ &nbsp;&nbsp;&nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__clrcall&nbsp;MemMapp(String^&nbsp;file)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;=&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!File::Exists(file))&nbsp;throw&nbsp;gcnew&nbsp;ApplicationException("Can&nbsp;not&nbsp;find&nbsp;file&nbsp;"&nbsp;+&nbsp;file); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marshal_context^&nbsp;x&nbsp;=&nbsp;gcnew&nbsp;marshal_context(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*nname&nbsp;=&nbsp;x->marshal_as<const&nbsp;char*>(file); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;=&nbsp;(pmapped)&nbsp;malloc(sizeof(mapped)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(map,&nbsp;sizeof(mapped)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->name&nbsp;=&nbsp;strdup(nname); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitMap(map); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;__clrcall&nbsp;MapBytes(long&nbsp;long&nbsp;loc,&nbsp;long&nbsp;length) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->low&nbsp;=&nbsp;loc&nbsp;&&nbsp;0xffffffff; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->high&nbsp;=&nbsp;(loc&nbsp;>>&nbsp;32)&nbsp;&&nbsp;0xffffffff; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->size&nbsp;=&nbsp;length&nbsp;&&nbsp;0xffffffff; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!GetMapForFile(map)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;gcnew&nbsp;ApplicationException("can&nbsp;not&nbsp;map&nbsp;range&nbsp;"&nbsp;+&nbsp;loc&nbsp;+&nbsp;"&nbsp;:"&nbsp;+&nbsp;length); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(map->size&nbsp;=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->size&nbsp;=&nbsp;MAXMAX&0xffffffff; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnmanagedMemoryStream&nbsp;^View() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;gcnew&nbsp;UnmanagedMemoryStream((unsigned&nbsp;char&nbsp;*)&nbsp;map->blok,&nbsp;map->size,&nbsp;map->size,&nbsp;FileAccess::Read);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;long&nbsp;__clrcall&nbsp;FileSize() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;high,&nbsp;low; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;long&nbsp;rv; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low&nbsp;=&nbsp;GetFileSize(map->hFile,&nbsp;&high); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxmax&nbsp;=&nbsp;high; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxmax&nbsp;<<&nbsp;32; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxmax&nbsp;+=&nbsp;low; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rv&nbsp;=&nbsp;high; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rv&nbsp;<<&nbsp;32; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rv&nbsp;=&nbsp;rv&nbsp;&&nbsp;low; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;rv; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;unsigned&nbsp;int&nbsp;MinBufSiz&nbsp;{&nbsp;unsigned&nbsp;int&nbsp;get()&nbsp;{&nbsp;return&nbsp;map->dwbufz;&nbsp;}&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;long&nbsp;long&nbsp;BufBase&nbsp;{&nbsp;long&nbsp;long&nbsp;get()&nbsp;{&nbsp;return&nbsp;(map->high&nbsp;<<&nbsp;32)&nbsp;+&nbsp;map->low;&nbsp;}&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;long&nbsp;long&nbsp;BufLim&nbsp;{&nbsp;long&nbsp;long&nbsp;get()&nbsp;{&nbsp;return&nbsp;((map->high&nbsp;<<&nbsp;32)&nbsp;+&nbsp;map->low)&nbsp;+&nbsp;map->size;&nbsp;}&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;long&nbsp;long&nbsp;MAXMAX&nbsp;{&nbsp;long&nbsp;long&nbsp;get()&nbsp;{&nbsp;return&nbsp;maxmax;&nbsp;}&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;MemMapp()&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__clrcall&nbsp;~MemMapp()&nbsp;{&nbsp;if(map&nbsp;!=&nbsp;NULL)&nbsp;{&nbsp;CloseMap(map);&nbsp;free(map->name);&nbsp;free(map);&nbsp;map&nbsp;=&nbsp;NULL;&nbsp;}&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;protected: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__clrcall&nbsp;!MemMapp()&nbsp;{&nbsp;if(map&nbsp;!=&nbsp;NULL)&nbsp;{&nbsp;CloseMap(map);&nbsp;free(map->name);&nbsp;free(map);&nbsp;map&nbsp;=&nbsp;NULL;&nbsp;}&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pmapped&nbsp;map; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;long&nbsp;maxmax;};这里至少是CLoseMap ...我刚发现它...它没有用/ CLR编译bool&nbsp;CloseMap(pmapped&nbsp;map){ &nbsp;&nbsp;&nbsp;&nbsp;if(map->blok&nbsp;!=&nbsp;NULL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnmapViewOfFile(map->blok); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->blok&nbsp;=&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if(map->hMap&nbsp;!=&nbsp;INVALID_HANDLE_VALUE&nbsp;&&&nbsp;map->hMap&nbsp;!=&nbsp;NULL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(map->hMap); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->hMap&nbsp;=&nbsp;INVALID_HANDLE_VALUE; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if(map->hFile&nbsp;!=&nbsp;INVALID_HANDLE_VALUE&nbsp;&&&nbsp;map->hFile&nbsp;!=&nbsp;NULL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(map->hFile); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map->hFile&nbsp;=&nbsp;INVALID_HANDLE_VALUE; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}

至尊宝的传说

您的应用程序有多种选择可以进行通信。最受欢迎的是Remoting和Pipes。有两个例子,在您选择之前,您应该考虑优点和缺点,如可移植性。以下是一些有用的链接:使用命名管道的.NET中的进程间通信,第1部分使用命名管道的.NET中的进程间通信,第2部分.NET Remoting简单英语.NET Remoting有一个简单的例子

翻阅古今

除了在C#app中导入win32函数之外,您还可以使用C ++ / CLI替代:[DllImport&nbsp;("kernel32.dll",&nbsp;SetLastError&nbsp;=&nbsp;true)] &nbsp;&nbsp;static&nbsp;extern&nbsp;IntPtr&nbsp;CreateFileMapping&nbsp;(IntPtr&nbsp;hFile, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;lpAttributes, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileProtection&nbsp;flProtect, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;dwMaximumSizeHigh, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;dwMaximumSizeLow, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;lpName); &nbsp;&nbsp;[DllImport&nbsp;("kernel32.dll",&nbsp;SetLastError=true)] &nbsp;&nbsp;static&nbsp;extern&nbsp;IntPtr&nbsp;OpenFileMapping&nbsp;(FileRights&nbsp;dwDesiredAccess, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;bInheritHandle, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;lpName); &nbsp;&nbsp;[DllImport&nbsp;("kernel32.dll",&nbsp;SetLastError&nbsp;=&nbsp;true)] &nbsp;&nbsp;static&nbsp;extern&nbsp;IntPtr&nbsp;MapViewOfFile&nbsp;(IntPtr&nbsp;hFileMappingObject, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileRights&nbsp;dwDesiredAccess, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;dwFileOffsetHigh, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;dwFileOffsetLow, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;dwNumberOfBytesToMap); &nbsp;&nbsp;[DllImport&nbsp;("Kernel32.dll")] &nbsp;&nbsp;static&nbsp;extern&nbsp;bool&nbsp;UnmapViewOfFile&nbsp;(IntPtr&nbsp;map); &nbsp;&nbsp;[DllImport&nbsp;("kernel32.dll")] &nbsp;&nbsp;static&nbsp;extern&nbsp;int&nbsp;CloseHandle&nbsp;(IntPtr&nbsp;hObject);
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答