Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Authenticode签名-仅对我的程序集进行签名_C#_Visual Studio_Msbuild_Code Signing_Authenticode - Fatal编程技术网

C# Authenticode签名-仅对我的程序集进行签名

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

我有一个具有以下结构的.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 $(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文件是第三方库。