2017-10-12 72 views
2

我有一个.NET解决方案具有以下结构:验证码签名 - 只有我签字组件

  • A.EXE
  • B.DLL
  • thirdParty.dll

我希望Authenticode签署我自己的二进制文件(a.exe和b.dll)。

我现在有A.EXE上的csproj文件生成后事件:

"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 

然而,这将签署所有的DLL,包括thirdParty.dll和运行也试图签署任何风险未管理的DLL。

现在最简单的解决方案是将后生成事件放在b.dll的csproj文件中,并删除上面显示的for循环。但是,实际上我们有很多组件,并且可能会增加更多。我不想依赖其他开发人员记住添加一个构建后步骤到Authenticode签署任何新的程序集。

我可以使用描述为here的PowerShell脚本来签署托管程序集,但在上例中仍会标记thirdParty.dll。

如何枚举并标记包含自己的代码的程序集?

回答

0

如何枚举并仅签署包含自己的代码的程序集?

您可以使用“if..else if”在你的循环语句来排除thirdParty.dll:下面生成后事件

为了测试这一点,我已经创建了测试样品:

for %%f in ("$(ProjectDir)$(OutDir)*.dll") do (if not "%%~nf"=="thirdParty" (echo %%~nf)) 

你可以使用你的符号命令:

"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))) 

希望这有助于。

+0

谢谢,但我们依靠多个第三方库。这个解决方案实际上有同样的问题,我们需要记住手动更新每个新库的后构建脚本。 – Tom

+0

@Tom,您需要记住手动更新第三方新库的后构建脚本,而不是每个新库。看起来你必须这样做,因为Visual Studio不够聪明,不知道哪个dll文件是第三方libray。 –