我正在使用以下内容对输出dll进行签名。
问题在于,这使得签名在每次构建完成后都运行,从而终止了增量构建。
我尝试使用Inputs="$(TargetPath)" Outputs="$(TargetPath)"
,但这根本不能运行签名任务。
一种可能的解决方案是编译到其他文件夹中,然后通过签名进行复制,这将使操作更加麻烦。
有没有更简单的东西?
<Target Name="Sign" AfterTargets="Build">
<Exec Command="signtool sign /f "$(SolutionDir)my.pfx" /p password /t http://timestamp.verisign.com/scripts/timstamp.dll "$(TargetPath)"" />
</Target>
答案 0 :(得分:0)
使用增量构建对MSBuild签名文件
正如您所知道的,我们不需要每次都对输出dll进行签名,因此通常在需要签名时,我们总是使用带有命令提示符的命令行来完成它:
此工具随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>