如何对WinUI 3应用(打包/未打包)进行代码签名?
WinUI 3 未打包应用本地C盘部署代码签名指南
核心结论
不用把未打包应用转为打包模式,直接给主EXE和关键依赖DLL做代码签名就能满足安全团队要求。另外,项目属性里的「为输出程序集签名以赋予强名称」是.NET程序集的强名称签名,和安全团队要求的代码签名(Authenticode签名)不是一回事,这个选项不用开,除非你的代码本身有强名称依赖需求。
准备工作
- 公司提供的PFX格式代码签名证书(保管好证书密码)
- 确保Visual Studio 2022已安装「Windows SDK」组件(signtool工具随SDK默认安装)
具体签名步骤
1. 定位signtool工具路径
打开VS的「开发者命令提示符」(开始菜单搜Visual Studio Developer Command Prompt),直接输入signtool能运行就说明路径已配置;如果不行,手动找路径,一般格式为:C:\Program Files (x86)\Windows Kits\10\bin\<SDK版本号>\x64\signtool.exe
(例如常见版本号10.0.22621.0)
2. 签名主EXE文件
在命令提示符中切换到应用的Release输出目录(比如bin\Release\net8.0-windows10.0.19041.0\win-x64),执行以下命令:
signtool sign /f "你的证书完整路径.pfx" /p "证书密码" /t http://timestamp.digicert.com /v "你的主程序.exe"
参数说明:
/f:指定PFX证书文件路径/p:证书的访问密码/t:指定时间戳服务器(必须添加,避免证书过期后签名失效)/v:显示详细签名过程,便于排查问题
3. 签名关键依赖DLL
无需给所有NuGet DLL签名:
- 微软官方的WinUI3、.NET相关DLL(如
Microsoft.UI.Xaml.dll)已有微软官方签名,不用重复签名 - 团队自研DLL、第三方未签名DLL需要签名,命令格式和签EXE一致,替换文件名即可:
signtool sign /f "你的证书完整路径.pfx" /p "证书密码" /t http://timestamp.digicert.com /v "自定义依赖.dll"
4. 验证签名有效性
签名完成后,用以下命令验证:
signtool verify /pa /v "已签名的文件.exe"
输出中显示「签名有效」即为成功。
可选:集成到VS构建流程(自动签名)
避免手动签名的繁琐,可将签名步骤加入项目构建事件:
- 打开WinUI3项目属性 → 「生成事件」→ 「后期生成事件命令行」
- 输入类似命令(替换为你的实际路径和信息):
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe" sign /f "$(SolutionDir)公司证书.pfx" /p "证书密码" /t http://timestamp.digicert.com /v "$(TargetPath)"
这样每次Release构建后会自动给主EXE签名,DLL可单独添加命令或编写批处理脚本批量处理。
部署注意事项
- 部署时将已签名的EXE、DLL复制到
C:\CompanyApplications文件夹,确保该文件夹权限符合公司要求(比如普通用户只读) - 更新应用时,先替换已签名的新文件,再同步更新桌面快捷方式(若有版本变更)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

