xUnit.Net未加载app.manifest致长路径支持失效问题求助
解决xUnit测试中Windows长路径支持失效的问题
方案1:给测试项目添加自定义app.manifest并配置
xUnit测试由测试宿主进程执行,你可以通过给测试项目添加app.manifest强制启用长路径支持:
- 右键测试项目 → 添加 → 新建项 → 选择「应用程序清单文件」(app.manifest)
- 在manifest的
<application>节点中,补充命名空间并添加长路径配置:
<application xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:v3="urn:schemas-microsoft-com:asm.v3"> <v3:windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings"> <ws2:longPathAware>true</ws2:longPathAware> </v3:windowsSettings> </application>
- 进入项目属性,确认「Manifest」选项已选中你添加的app.manifest
- 若使用.NET Core/.NET 5+,还需在项目文件(.csproj)中嵌入manifest:
<PropertyGroup> <ApplicationManifest>app.manifest</ApplicationManifest> </PropertyGroup>
方案2:修改Visual Studio测试宿主的全局配置
如果用Visual Studio自带的测试运行器,可以修改宿主配置来全局启用长路径:
- 找到Visual Studio安装目录下的
vstest.console.exe.config(示例路径:C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\Common7\IDE\Extensions\TestPlatform) - 在
<configuration>节点内添加:
<runtime> <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" /> </runtime>
- 注意:这是全局设置,会影响所有通过vstest运行的测试项目。
方案3:通过.NET AppContext开关配置(无业务代码修改)
无需改动测试或业务代码,仅通过项目配置启用长路径:
- 在测试项目的
.csproj文件中添加:
<PropertyGroup> <RuntimeHostConfigurationOption Include="System.IO.UseLegacyPathHandling" Value="false" /> <RuntimeHostConfigurationOption Include="System.IO.BlockLongPaths" Value="false" /> </PropertyGroup>
- 或者在测试项目的
Properties/launchSettings.json中配置环境变量:
"environmentVariables": { "DOTNET_SYSTEM_IO_USELEGACYPATHHANDLING": "false", "DOTNET_SYSTEM_IO_BLOCKLONGPATHS": "false" }
验证配置是否生效
可以添加测试用例确认长路径支持已启用:
[Fact] public void CheckLongPathSupportStatus() { var legacyEnabled = AppContext.TryGetSwitch("Switch.System.IO.UseLegacyPathHandling", out var legacyVal) && legacyVal; var blockEnabled = AppContext.TryGetSwitch("Switch.System.IO.BlockLongPaths", out var blockVal) && blockVal; Assert.False(legacyEnabled, "遗留路径处理应已禁用"); Assert.False(blockEnabled, "长路径拦截应已禁用"); }
内容的提问来源于stack exchange,提问作者MadMax
相关产品推荐
相关产品推荐

