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

如何在目标为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?

可以引用,但需要手动配置项目文件,具体步骤如下:

  1. 编辑项目的.csproj文件
    右键项目 -> 选择“编辑项目文件”(VS2017支持直接编辑),在<Project>节点内添加以下引用配置:

    <ItemGroup>
      <!-- 引用System.Windows.Forms -->
      <Reference Include="System.Windows.Forms" />
      <!-- 如果需要用到绘图相关功能,可一并引用System.Drawing -->
      <Reference Include="System.Drawing" />
    </ItemGroup>
    
  2. 保存并重新加载项目
    保存修改后的.csproj文件,VS会自动重新加载项目,此时你就能在代码里正常使用System.Windows.Forms的类(比如FormMessageBox等)了。

二、更宽泛的问题: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

火山引擎 最新活动