首页 > 解决方案 > 使用增量构建对文件 MSBuild 进行签名

问题描述

我正在使用以下内容对我的输出 dll 进行签名。

问题是这使得每次构建完成时都会运行签名,这会杀死增量构建。

我尝试使用Inputs="$(TargetPath)" Outputs="$(TargetPath)",但这根本不运行签名任务。

一种可能的解决方案是编译到不同的文件夹中,然后通过签名进行复制,这使得这更加麻烦。

有没有更简单的?

<Target Name="Sign" AfterTargets="Build">
    <Exec Command="signtool sign /f &quot;$(SolutionDir)my.pfx&quot; /p password /t http://timestamp.verisign.com/scripts/timstamp.dll &quot;$(TargetPath)&quot;" />
</Target>

标签: visual-studiomsbuildsigntool

解决方案


此 MSBuild 配置片段将使用 signtool 对输出程序集进行签名,并为发布配置添加时间戳,假设 .NET Framework 的版本足够新,可以使用 Roslyn。

每次编译时,Roslyn 都会触发“SignExe”目标。

<PropertyGroup>
  <TargetsTriggeredByCompilation>
    SignExe
  </TargetsTriggeredByCompilation>
</PropertyGroup>
<Target Name="SignExe">
  <PropertyGroup>
    <CodeSignThumbprint>SHA1CERTTHUMBPRINTHERE</CodeSignThumbprint>
  </PropertyGroup>
  <SignFile SigningTarget="@(IntermediateAssembly)" CertificateThumbprint="$(CodeSignThumbprint)" TargetFrameworkVersion="$(TargetFrameworkVersion)" TimestampUrl="http://timestamp.verisign.com/scripts/timstamp.dll" Condition="'$(Configuration)' == 'Release'"></SignFile>
  <SignFile SigningTarget="@(IntermediateAssembly)" CertificateThumbprint="$(CodeSignThumbprint)" TargetFrameworkVersion="$(TargetFrameworkVersion)" Condition="'$(Configuration)' != 'Release'"></SignFile>
</Target>

推荐阅读