如何在VS Code中为C#项目添加.NET Core内置程序集(以System.Windows.Forms为例)
我来帮你搞定这个问题——你遇到的错误核心原因是引用了仅用于编译的引用程序集(Reference Assembly),这类文件只有类型定义,没有实际运行代码,所以运行时加载必然失败。下面是正确的操作流程和问题解析:
问题原因解析
你手动添加的<Reference>节点指向的System.Windows.Forms.dll大概率来自.NET的引用程序集包(比如路径在C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\...下),这类dll是给编译器做类型检查用的“存根文件”,完全不能用来执行,所以才会抛出Reference assemblies should not be loaded for execution的错误。
正确的解决步骤
System.Windows.Forms在.NET Core/.NET 5+中是通过NuGet包提供的,不需要手动引用系统dll,按以下步骤操作:
1. 确认项目目标框架
确保你的项目目标框架是.NET Core 3.0及以上版本,并且是Windows专属的目标框架(比如net8.0-windows)。如果还没设置,打开项目文件(.csproj)修改:
<PropertyGroup> <TargetFramework>net8.0-windows</TargetFramework> </PropertyGroup>
2. 启用Windows Forms支持
在项目文件的<PropertyGroup>里添加UseWindowsForms属性,这会自动引入所有Windows Forms所需的运行时依赖和程序集:
<PropertyGroup> <OutputType>WinExe</OutputType> <!-- 针对纯WinForms项目,隐藏控制台窗口 --> <TargetFramework>net8.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> </PropertyGroup>
3. 安装System.Windows.Forms NuGet包(可选但推荐)
虽然启用UseWindowsForms后会自动引入依赖,但你也可以手动通过终端命令安装,确保依赖最新:
dotnet add package System.Windows.Forms
完成以上步骤后,你就可以正常在代码里引用System.Windows.Forms命名空间,编译和运行都不会出错了。
补充:调试时窗口消失的处理
如果你的项目是控制台类型(<OutputType>Exe</OutputType>),调试时窗口一闪而过是因为程序执行完Main方法就退出了。要解决这个问题,确保在Main方法里启动WinForms应用:
using System.Windows.Forms; namespace MyProgram { class Program { static void Main(string[] args) { // 初始化WinForms环境 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 启动主窗体,这会让程序保持运行直到窗体关闭 Application.Run(new Form1()); } } }
如果是纯WinForms项目,设置<OutputType>WinExe</OutputType>即可,程序启动时不会显示控制台窗口,也会正常保持运行状态。
内容的提问来源于stack exchange,提问作者Terry Yeung

