【问题标题】:Sign file MSBuild with incremental build使用增量构建对文件 MSBuild 进行签名
【发布时间】:2018-09-25 11:00:48
【问题描述】:

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


    【解决方案1】:

    此 MSBuild 配置的 sn-p 将使用 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>
    

    【讨论】:

      【解决方案2】:

      使用增量构建签署文件 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"
      

      希望这会有所帮助。

      【讨论】:

      • 我确实需要为每个构建签名 dll。我有验证 dll 签名的代码。
      • 不知道为什么。将日志记录添加到构建并使用 MSBuild 日志查看器 msbuildlog.com 检查
      【解决方案3】:

      答案就是在不涉及链接时不签名。

            <!-- 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>
      

      【讨论】:

      • 嗨 - 我正在使用它,但偶尔会在签名失败的情况下出现错误,因为文件正在“使用中”,任何想法是否可能是我的错,或者它是否有问题用这个目标做什么?
      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2015-09-13
      • 2011-04-30
      相关资源
      最近更新 更多