2017-10-12 73 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。 –