VS 缺组件:SignTool.exe 与 .NET Framework 目标包
2022 年 2 月 23 日 · 2 分钟读完
项目在 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):
或者在 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),目标机器上什么都不用装。
原文首发于 blog.csdn.net