按照this网站的代码示例,我创建了一个创建映射内存文件的Windows控制台应用程序:
using (var file = MemoryMappedFile.CreateNew("myFile", 24))
{
var bytes = new byte[24];
for (var i = 0; i < bytes.Length; i++)
bytes[i] = (byte)(65 + i);
using (var writer = file.CreateViewAccessor(0, bytes.Length))
{
writer.WriteArray<byte>(0, bytes, 0, bytes.Length);
}
Console.WriteLine("Run memory mapped file reader before exit");
Console.WriteLine("Press any key to exit ...");
Console.ReadLine();
}
在新的asp.net Web应用程序中,我使用代码阅读MMF:
protected void Page_Load(object sender, EventArgs e)
{
string sOutput = "";
using (var file = MemoryMappedFile.OpenExisting("myFile"))
{
using (var reader = file.CreateViewAccessor(0, 24))
{
var bytes = new byte[24];
reader.ReadArray<byte>(0, bytes, 0, bytes.Length);
for (var i = 0; i < bytes.Length; i++)
sOutput += (char)bytes[i] + " ";
}
}
Response.Write(sOutput);
}
在开发IIS Express中,文件按预期读取,页面显示映射内存文件中的数据。
但是,当部署到IIS时,我在System.IO.FileNotFoundException
MemoryMappedFile.OpenExisting("myFile")
我尝试将应用池标识更改为与运行MMF控制台应用程序的标识相同,但这确实不起作用。
答案 0 :(得分:2)
如果您正在尝试实现进程间通信(IPC),则可以将WCF与命名管道绑定一起使用。您可以通过一些性能来获得很多简单性。
答案 1 :(得分:2)
添加&#34;全球\\&#34; mapName的前缀。这是它对我有用的唯一方式。 当我们尝试访问在第一个进程中创建的共享内存时,它在不同的安全上下文中运行,并且共享内存对象不可见,除非它们是在全局名称空间中创建的。
这是适合我的代码。我在WinForm应用程序中使用了CreateOrOpen,并在IIS进程中使用了OpenExisting:
mSec = new MemoryMappedFileSecurity();
mSec.AddAccessRule(new AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
mmf = MemoryMappedFile.CreateOrOpen("Global\\\MmfName", 100, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, mSec, HandleInheritability.Inheritable);
mmf = MemoryMappedFile.OpenExisting("Global\\\MmfName");
答案 2 :(得分:1)
对于非物理文件,有两种情况,
您必须使用http://msdn.microsoft.com/en-us/library/dd267529(v=vs.110).aspx此构造函数以及以下安全性。
MemoryMappedFileSecurity mSec = new MemoryMappedFileSecurity ();
mSec.AddAccessRule(new AccessRule<MemoryMappedFileRights>(new SecurityIdentifier(WellKnownSidType.WorldSid, null),
MemoryMappedFileRights .FullControl, AccessControlType.Allow));
然后尝试从IIS以相同的安全性访问它。