You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:.NET Core 2 Web应用(VS2017)中Windows.Forms运行及程序集加载问题

嘿,我来帮你搞定这个问题!你碰到的System程序集加载失败的问题,本质是.NET Core 2 Web应用和Windows.Forms(依赖传统.NET Framework)之间的兼容性冲突,尤其是在Web场景下调用时的程序集加载逻辑问题。下面是一步步的解决办法:

具体解决方案

1. 先明确项目兼容性前提

首先得清楚:.NET Core 2.x是跨平台框架,但Windows.Forms是仅支持Windows平台的.NET Framework专属组件,直接在.NET Core Web项目里引用必然会有程序集加载的兼容性问题。你需要把项目切换为Windows专属的.NET Core 2.x模式,这是解决问题的基础。

2. 修改项目配置文件(.csproj)

打开你的项目.csproj文件,做以下两处修改:

  • 添加Windows平台目标和Windows Forms启用配置:
    <PropertyGroup>
      <TargetFramework>netcoreapp2.0</TargetFramework>
      <RuntimeIdentifier>win-x86</RuntimeIdentifier> <!-- 或者win-x64,根据你的操作系统选择 -->
      <UseWindowsForms>true</UseWindowsForms>
    </PropertyGroup>
    
  • 引入微软官方的兼容性包,用来桥接.NET Core和传统.NET Framework的系统程序集:
    <ItemGroup>
      <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.1" />
    </ItemGroup>
    

3. 自定义程序集加载逻辑

如果修改.csproj后还是出现System程序集找不到的错误,需要在Program.cs里添加一段程序集加载的兼容代码,帮助.NET Core定位正确的程序集版本:

using System.Runtime.Loader;
using System.Reflection;
using System;

namespace YourWebAppNamespace
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // 添加这段程序集加载解析逻辑
            AssemblyLoadContext.Default.Resolving += (context, assemblyName) =>
            {
                if (assemblyName.Name.Equals("System", StringComparison.OrdinalIgnoreCase) 
                    && assemblyName.Version.Major == 4)
                {
                    return context.LoadFromAssemblyName(new AssemblyName("System"));
                }
                return null;
            };

            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

4. 检查Azure存储依赖的兼容性

你提到还有Azure存储相关的错误,要确保你使用的Azure存储NuGet包是支持.NET Core 2.x的版本。推荐使用WindowsAzure.Storage的9.3.3版本(这是适配.NET Core 2.x的稳定版本),避免使用过高版本导致和.NET Core 2.x的兼容性冲突。

5. 清理重建项目,清除缓存

做完以上修改后,一定要执行以下步骤:

  • 右键项目 → 清理
  • 右键项目 → 重建
  • 重启VS2017,避免IDE缓存导致的旧配置残留

额外的建议

其实在Web应用里直接使用Windows Forms并不是一个推荐的做法,因为Web应用通常是无UI的后端服务。如果你的需求是在Web API里调用Windows Forms的某些功能(比如打印、特定控件逻辑),建议把这部分逻辑抽成一个单独的.NET Framework类库,然后通过进程外调用或者兼容性层来处理,这样可以避免Web项目和Windows Forms的直接依赖冲突。

另外,如果条件允许,升级到VS2019+和.NET 5+会更好,新版本的.NET对Windows Forms和Web应用的集成支持要完善得多。

内容的提问来源于stack exchange,提问作者Dave

火山引擎 最新活动