← 全部文章 运维踩坑

VS 缺组件:SignTool.exe 与 .NET Framework 目标包

2022 年 2 月 23 日 · 2 分钟读完

目录
  1. 未找到 SignTool.exe
  2. 办法一:不签名
  3. 办法二:补上 SignTool
  4. 找不到 .NET Framework 的引用程序集
  5. 延伸

项目在 VS2019 上开发,拿到 VS2015 上发布时报错:签名时出错:未找到 SignTool.exe。顺便把另一个常见的缺组件问题(缺 .NET Framework 目标包)也记在这里。

未找到 SignTool.exe

SignTool 是 Windows SDK 里的代码签名工具。VS 在「发布」(ClickOnce)时默认会对清单签名,就要调用它;这台电脑的 VS 没装对应的 SDK,就找不到。

办法一:不签名

如果不需要 ClickOnce 签名(大部分内部使用的上位机都不需要),直接关掉:项目右键 → 属性 → 签名 → 取消勾选「为 ClickOnce 清单签名」,保存后重新发布。

办法二:补上 SignTool

看一下 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin(版本号可能不同)下有没有 signtool.exe。没有的话:

  • 打开 Visual Studio Installer → 修改 → 单个组件,勾选 ClickOnce 发布工具 或某个版本的 Windows SDK,装完就有了;
  • 原文也附了单独的文件:SignTool 下载,以及 VS 安装包的位置:

找不到 .NET Framework 的引用程序集

换一台电脑打开老项目,编译时报:

MSB3644: 找不到 .NETFramework,Version=v4.6.1 的引用程序集。
要解决此问题,请为此框架版本安装开发人员工具包(SDK/目标包)……

原因是这台电脑只装了 .NET Framework 的运行时,没装对应版本的开发人员工具包(Developer Pack / 目标包)。运行时只能运行程序,编译需要目标包里的引用程序集。

解决:到微软官网下载对应版本的 Developer Pack(注意不是 Runtime):

.NET Framework 官方下载

或者在 Visual Studio Installer → 单个组件里勾选「.NET Framework 4.x 目标包」。

有些很老的版本(4.5 以下)官网已经不提供目标包了,这时可以把项目的目标框架改成已安装的较新版本(项目属性 → 应用程序 → 目标框架),4.x 之间基本兼容。

延伸

  • 运行时版本:.NET Framework 4.x 是「就地更新」的,装了 4.8 就能运行所有 4.x 的程序。所以目标机器上装最新的 4.8 / 4.8.1 运行时即可,不用每个版本都装。Win10 1903 以后自带 4.8。
  • 查已安装的版本:注册表 HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 下的 Release 值,528040 以上就是 4.8。
  • 跨版本 VS 协作:项目在高版本 VS 里改过,低版本可能打不开或缺组件。团队里最好统一 VS 版本,或者至少统一目标框架和 C# 语言版本(<LangVersion>)。
  • 新项目的选择:新项目建议用 .NET 6 / 8,可以发布成自带运行时的单文件程序(dotnet publish -r win-x64 --self-contained -p:PublishSingleFile=true),目标机器上什么都不用装。

# Visual Studio # .NET Framework

原文首发于 blog.csdn.net