使用增量构建对文件MSBuild进行签名

时间:2018-09-25 11:00:49

标签: visual-studio msbuild signtool

我正在使用以下内容对输出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>

3 个答案:

答案 0 :(得分:0)

  

使用增量构建对MSBuild签名文件

正如您所知道的,我们不需要每次都对输出dll进行签名,因此通常在需要签名时,我们总是使用带有命令提示符的命令行来完成它:

SignTool.exe (Sign Tool)

  

此工具随Visual Studio自动安装。运行   工具,使用开发人员命令提示符(或Visual Studio命令)   在Windows 7中提示)。有关更多信息,请参见命令提示符。

或者我们可以使用自定义目标来执行它,但是不使用AfterTargets="Build,否则,它将在构建项目时始终执行,就像您所说的“杀死增量构建”。

当我们需要对输出dll进行签名时,我们使用MSBuild.exe来构建具有指定目标Sign的项目,例如:

MSBuild.exe /t:build,test "Yoursolution.sln"

希望这会有所帮助。

答案 1 :(得分:0)

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

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>

答案 2 :(得分:0)

答案是不参与链接时不签名。

      <!-- Sign only if produced an output-->
  <Target Name="SignOutput" AfterTargets="CoreBuild;Link" BeforeTargets="PostBuildEvent;AfterBuild" Condition="'$(LinkSkippedExecution)' == 'False'">
    <Message Importance="High" Text="Signing $(TargetPath)"/>
    <Exec Command="signtool ... " /> <!-- Either manugally calling signtool -->
    <SignFile .../> <!-- Or any other command to sign -->
  </Target>