求助:.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




