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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:25:27