WSL发布.NET5跨平台应用时新NuGet包提示无法加载文件或程序集
排查解决步骤
- 优先规避跨文件系统编译问题:不要直接在WSL的/mnt/c挂载目录下执行发布操作,先把整个项目文件夹复制到WSL原生文件系统(如/home/当前用户目录)再执行发布命令。Windows NTFS和WSL ext4的文件系统权限、大小写敏感性差异会导致dotnet的还原、编译逻辑异常,跨挂载目录共享项目文件夹是这类跨平台发布问题的高发诱因。
- 强制指定运行时执行完整清理还原:先执行清理命令
dotnet clean Project.sln -r linux-x64,再执行强制无缓存还原命令dotnet restore Project.sln -r linux-x64 --force --no-cache,执行发布命令时加上--no-restore参数,强制使用本次刚还原的依赖,完整发布命令如下:dotnet publish -c Release -o publish -p:PublishReadyToRun=true -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true -p:IncludeNativeLibrariesForSelfExtract=true --runtime linux-x64 --no-restore Project.sln - 排查程序集裁剪导致的丢失问题:你开启了
PublishTrimmed=true参数,部分未适配裁剪逻辑的NuGet包会被IL Linker误裁掉依赖程序集,可先临时将该参数改为false测试发布,如果运行正常就说明是裁剪导致的问题,只需在csproj文件中为报错的NuGet包添加裁剪排除配置即可:
<ItemGroup> <TrimmerRootAssembly Include="你报错的程序集名称" /> </ItemGroup>
- 验证SDK版本一致性:在WSL中执行
dotnet --list-sdks,确认安装的.NET 5 SDK版本和Windows端Visual Studio使用的SDK版本完全一致,版本差异也会导致依赖加载逻辑不兼容。 - 定位具体加载错误:运行发布后的程序前,先在WSL终端执行
export COREHOST_TRACE=1开启运行时日志,再启动程序,输出的完整程序集加载日志可以明确看到加载失败的程序集搜索路径,快速定位是还原阶段未下载对应包,还是发布阶段未打包进单文件。
内容的提问来源于stack exchange,提问作者MortenMoulder
相关产品推荐
相关产品推荐

