ASP.NET Core应用部署IIS时无法加载System.Windows.Forms程序集
解决ASP.NET Core+Windows Forms部署IIS的程序集加载问题
问题场景
项目配置:
<UseWindowsForms>true</UseWindowsForms> <TargetFramework>net6.0-windows</TargetFramework> <SelfContained>false</SelfContained>
服务器已安装ASP.NET Core托管捆绑包,但调用依赖Windows Forms的代码时抛出错误:
System.IO.FileNotFoundException: 无法加载文件或程序集'System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'。系统找不到指定的文件。
核心原因
ASP.NET Core托管捆绑包仅包含ASP.NET Core运行时组件,Windows Forms属于.NET桌面运行时范畴,服务器未安装对应版本的.NET Desktop Runtime,导致无法定位WinForms程序集。
基础解决方案
方案1:给服务器安装.NET Desktop Runtime
- 下载并安装与项目
TargetFramework匹配的.NET 6 Desktop Runtime(需包含6.0.2及以上补丁版本,确保覆盖依赖的程序集版本) - 安装完成后重启IIS站点,使运行时生效
方案2:切换为自包含部署
修改项目csproj配置,将部署模式改为自包含:
<SelfContained>true</SelfContained> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 根据服务器架构选择win-x86/win-arm64 -->
发布项目时,会将所有依赖的程序集(包括System.Windows.Forms及对应版本)打包到输出目录,无需依赖服务器预装的运行时。
补充问题:组件依赖特定版本(如6.0.2.0)的处理
不需要使用传统.NET Framework的程序集重定向文件(app.config),.NET 6+有更简洁的处理方式:
- 优先用自包含部署:发布时直接打包组件依赖的特定版本程序集,彻底规避服务器运行时版本不匹配问题
- 匹配服务器运行时版本:安装包含目标版本补丁的.NET Desktop Runtime(.NET 6 LTS的高补丁版本会向下兼容低版本程序集请求,比如安装6.0.20的Desktop Runtime可处理6.0.2的程序集加载请求)
- 手动配置程序集绑定:若必须依赖服务器运行时,可在项目的
runtimeconfig.template.json中添加绑定规则,将特定版本的程序集请求重定向到服务器已安装的版本:{ "runtimeOptions": { "assemblyBinding": { "dependencies": [ { "name": "System.Windows.Forms", "publicKeyToken": "b77a5c561934e089", "version": "6.0.2.0", "redirectTo": "6.0.20.0" // 替换为服务器已安装的版本 } ] } } }
内容的提问来源于stack exchange,提问作者AbiSinghal
相关产品推荐
相关产品推荐

