如何在目标为net462的SDK项目中引用System.Windows.Forms及GAC系统库
在VS 2017的.NET Framework 4.6.2 SDK项目中引用System.Windows.Forms及GAC系统库
好问题!我之前也碰到过一模一样的困惑——明明目标框架是.NET Framework 4.6.2(号称完整框架),但SDK风格项目就是没法开箱即用System.Windows.Forms这类GAC里的系统库,确实有点反直觉。下面给你拆解解决方案和背后的原因:
一、如何给net462 SDK项目引用System.Windows.Forms?
可以引用,但需要手动配置项目文件,具体步骤如下:
编辑项目的.csproj文件
右键项目 -> 选择“编辑项目文件”(VS2017支持直接编辑),在<Project>节点内添加以下引用配置:<ItemGroup> <!-- 引用System.Windows.Forms --> <Reference Include="System.Windows.Forms" /> <!-- 如果需要用到绘图相关功能,可一并引用System.Drawing --> <Reference Include="System.Drawing" /> </ItemGroup>保存并重新加载项目
保存修改后的.csproj文件,VS会自动重新加载项目,此时你就能在代码里正常使用System.Windows.Forms的类(比如Form、MessageBox等)了。
二、更宽泛的问题:SDK项目中如何使用GAC里的系统库?
原理和上面一样——手动在.csproj中添加<Reference>节点,只要目标程序集存在于GAC中,直接填写程序集名称即可,MSBuild会自动从GAC中查找并加载。
举个例子,如果你要引用GAC中的System.Data.OracleClient,只需添加:
<ItemGroup> <Reference Include="System.Data.OracleClient" /> </ItemGroup>
三、为什么会有“开箱即用不支持”的情况?
这其实是SDK风格项目的设计逻辑导致的:
- SDK风格项目最初是为.NET Core设计的,它的默认引用集非常精简,只包含基础的框架库;
- 后来虽然扩展支持了.NET Framework,但并没有继承传统.NET Framework项目(非SDK风格)的“自动引入大量GAC系统库”的逻辑;
- 传统非SDK项目依赖的是
Microsoft.CSharp.targets这类目标文件,会自动引入桌面UI、数据访问等一系列常用GAC库,而SDK项目用的是Microsoft.NET.Sdk.targets,默认只包含最基础的.NET Framework组件。
所以并不是.NET Framework 4.6.2不完整,而是SDK项目的默认配置更偏向轻量化,需要你手动按需添加引用。
内容的提问来源于stack exchange,提问作者Dejan




