发布VS2022 WinForms程序后遇System.IO.FileLoadException问题求助
问题分析与解决方案
核心问题
发布后的Windows Forms程序因无法加载System.Private.Uri, Version=6.0.0.0程序集抛出FileLoadException,但在Visual Studio调试、本地管理员运行时正常,其他发布程序无此问题,且入口函数的try-catch无法捕获异常(说明异常发生在Main执行前的运行时初始化阶段)。
可能诱因
- 发布过程中依赖项打包不完整,
System.Private.Uri.dll未被正确包含到输出目录 - 目标机器的.NET Desktop Runtime版本与项目编译/发布版本不匹配,引发程序集版本冲突
- 发布模式(框架依赖/独立部署)的配置缺陷,导致运行时无法定位依赖组件
解决步骤
1. 检查发布依赖项完整性
- 打开项目属性→发布→查看文件发布选项:若使用「生成单个文件」,确保勾选「包含所有依赖项」;若非单文件发布,直接检查发布输出目录中是否存在
System.Private.Uri.dll - 若为框架依赖部署,确认目标机器已安装对应版本的.NET Desktop Runtime(例如项目基于.NET 6,则需安装.NET 6 Desktop Runtime)
2. 添加程序集绑定重定向
在项目的app.config(或发布后的YourAppName.exe.config)中添加重定向配置,让运行时自动适配可用的System.Private.Uri版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Private.Uri" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
若为.NET 6+项目,需在.csproj文件中启用自动生成绑定重定向:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
3. 切换发布模式测试
- 若当前为框架依赖发布,改为独立部署,打包所有.NET运行时组件,避免目标机器的运行版本问题
- 若当前为独立部署,切换为框架依赖,验证目标机器的运行时是否兼容
4. 清理缓存后重新发布
在Visual Studio中依次执行:清理解决方案→生成解决方案→重新发布,清除旧缓存文件的干扰
内容的提问来源于stack exchange,提问作者mvi2110
相关产品推荐
相关产品推荐

