0

我有一个任务通过 NuGet 包AfterBuild对 dll 进行签名signtool.exeMSBuild.ExtensionPack

<MSBuild.ExtensionPack.Framework.CommandLine Command="&quot;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe&quot; sign &quot;/n&quot; &quot;MY CERTIFICATE&quot; &quot;/t&quot; &quot;http://timestamp.comodoca.com/authenticode&quot; &quot;$(TargetPath).&quot;" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />

由于构建环境之间的一些差异(一些远程构建代理具有不同版本的 Visual Studio,因此 Windows SDK),当代理安装了 SDK 版本 8.0 时,此任务将失败。

当且仅当任务失败时,是否有可能触发不同的任务?

即如果上述任务失败,则运行具有不同路径的替代任务signtool.exe

4

2 回答 2

1

作为替代解决方案,我提出了以下方法来检查可能的路径并使用找到的最新版本:

<PropertyGroup>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe')">C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe')">C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe')">C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe')">C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe</SignToolPath>
    <SignToolPath Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == '' And Exists('C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\signtool.exe')">C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\signtool.exe</SignToolPath>
</PropertyGroup>
<Error Condition="'$(Configuration)' == 'Release' And '$(SignToolPath)' == ''" Text="Unable to determine signtool path" />
<MSBuild.ExtensionPack.Framework.CommandLine Command="&quot;$(SignToolPath)&quot; sign &quot;/n&quot; &quot;MY CERTIFICATE&quot; &quot;/t&quot; &quot;http://timestamp.comodoca.com/authenticode&quot; &quot;$(TargetPath).&quot;" Condition=" '$(Configuration)' == 'Release' " />
于 2016-06-06T16:50:23.460 回答
0

您可以使用标记您的任务,ContinueOnError="true"然后使用MSBuildLastTaskResult保留属性来检查您的任务是否成功。

像这样的东西:

<MSBuild.ExtensionPack.Framework.CommandLine
    ContinueOnError="true"
    Command="path_to_signtool.exe"
    .... />
<MSBuild.ExtensionPack.Framework.CommandLine
    Condition="'$(MSBuildLastTaskResult)' == 'False'"
    Command="another_path_to_signtool.exe"
    .... />

另请参阅此答案

于 2016-06-07T10:20:03.193 回答