C# Authenticode签名-仅对我的程序集进行签名
我有一个具有以下结构的.Net解决方案:C# Authenticode签名-仅对我的程序集进行签名,c#,visual-studio,msbuild,code-signing,authenticode,C#,Visual Studio,Msbuild,Code Signing,Authenticode,我有一个具有以下结构的.Net解决方案: a、 exe b、 动态链接库 第三方.dll 我只想对我自己的二进制文件(a.exe和b.dll)进行身份验证码签名。 我当前在csproj文件上有一个a.exe的生成后事件: "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPa
- a、 exe
- b、 动态链接库
- 第三方.dll
"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath)
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath) %%f
但是,这将对包括thirdParty.dll在内的所有dll进行签名,并且还可能尝试对任何未管理的dll进行签名
现在最简单的解决方案是在csproj文件上为b.dll放置一个构建后事件,并删除上面显示的for循环。然而,实际上,我们有许多组件,可能会添加更多。我不想依赖于其他开发人员记住添加构建后步骤来对任何新程序集进行Authenticode签名
我可以使用描述的PowerShell脚本仅对托管程序集进行签名,但在上面的示例中,它仍然会对thirdParty.dll进行签名
如何仅枚举和签名包含自己代码的程序集
如何仅枚举和签名包含自己代码的程序集
您可以在循环语句中使用“if..else if
”来排除thirdParty.dll
:
为了测试这一点,我创建了带有以下生成后事件的测试示例:
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty" (echo %%~nf))
您可以使用sign命令:
"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath)
而不是测试命令echo%%~nf
此外,如果需要排除多个thirdParty.dll文件,则可以使用叠加的if
语句:
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty1" (if not "%%~nf"=="thirdParty2" ( echo %%~nf)))
希望这有帮助。谢谢,但我们依赖多个第三方库。此解决方案的问题实际上与我们需要记住为每个新库手动更新生成后脚本的问题相同。@Tom,您需要记住为第三方新库而不是每个新库手动更新生成后脚本。看起来您必须这样做,因为VisualStudio不够聪明,无法知道哪个dll文件是第三方库。