You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8中跨进程共享Memory Mapped File时客户端找不到文件

排查MemoryMappedFile跨进程访问的FileNotFoundException问题(Windows环境)

针对你遇到的服务端能创建MMF、客户端调用MemoryMappedFile.OpenExisting触发FileNotFoundException的问题,结合Windows平台特性和跨平台兼容要求,整理以下排查方向和解决方法:

1. 检查Windows下MMF的命名规则

Windows对内存映射文件的名称有特殊命名空间限制,直接使用普通名称(如MyMMF)可能导致跨进程找不到资源:

  • 如果服务端和客户端属于不同会话(比如服务端是系统服务、客户端是桌面应用),必须使用Global\前缀(如Global\MySharedMMF),否则会话隔离会导致客户端无法访问。
  • 同一会话内的进程可以用Local\前缀,或省略前缀(但不推荐,避免冲突)。

2. 验证MMF的权限配置

服务端创建MMF时如果未显式设置权限,默认权限可能限制了客户端进程的访问(尤其是客户端权限低于服务端时,系统会用FileNotFoundException掩盖权限不足的真实错误)。创建时需添加全局访问权限:

var mmfSecurity = new MemoryMappedFileSecurity();
mmfSecurity.AddAccessRule(new AccessRule<MemoryMappedFileRights>(
    new SecurityIdentifier(WellKnownSidType.WorldSid, null),
    MemoryMappedFileRights.FullControl,
    AccessControlType.Allow));

// 创建带权限的MMF
var serverMMF = MemoryMappedFile.CreateNew(
    "Global\\MySharedMMF",
    1024 * 1024, // 映射大小
    MemoryMappedFileAccess.ReadWrite,
    MemoryMappedFileOptions.None,
    mmfSecurity,
    HandleInheritability.None);

3. 确认MMF的生命周期

服务端的MemoryMappedFile实例如果被提前GC回收,系统会自动销毁MMF资源,导致客户端找不到。确保服务端在通信周期内始终持有该实例的引用,避免被垃圾回收。

4. 匹配两端的访问模式

服务端创建MMF时指定的MemoryMappedFileAccess必须与客户端打开时的模式兼容:

  • 服务端用Read模式创建,客户端不能用ReadWrite打开;
  • 两端尽量保持一致的访问模式(如都用ReadWrite),避免权限冲突导致的隐藏错误。

5. 跨平台兼容的命名适配

为兼顾Linux环境,需区分Windows和Linux的MMF命名规则:

  • Linux下MMF基于文件系统路径(如/tmp/MySharedMMF),而非Windows的命名空间前缀;
  • 可以封装一个跨平台命名方法:
public static string GetCrossPlatformMMFName(string baseName)
{
    return OperatingSystem.IsWindows() 
        ? $"Global\\{baseName}" 
        : Path.Combine(Path.GetTempPath(), baseName);
}

额外注意:检查两端使用的MMF名称是否完全一致,Windows下MMF名称不区分大小写,但严格匹配可避免意外问题。

内容的提问来源于stack exchange,提问作者Account of Working

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:58:24