4

可以Condition用来验证 的AssemblyFile属性是否存在UsingTask

<UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"
        Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\')"/>

<UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll"
        Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\')"/>
4

1 回答 1

4

更新:

在使用不存在的路径测试您的代码后,我重现了您的错误。在挑战加载任务 dll 后,可能会评估条件。

您可以通过首先构建路径来修改代码以消除错误(使用$(VisualStudioVersion)或手动:

<Project ToolsVersion="4.0" DefaultTargets="Echo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  

    <PropertyGroup>
        <VSExtPath>$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\</VSExtPath>
        <VSExtPath Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0')">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\</VSExtPath>
    </PropertyGroup>

    <UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(VSExtPath)\Web\Microsoft.Web.Publishing.Tasks.dll" />

    <Target Name="Echo">
        <Message Text="$(VSExtPath)" />     
        <TransformXml />
    </Target>
</Project>

另一种解决方案是以普通文件使用$(VisualStudioVersion)属性的相同方式使用属性。.csproj

您可以使用 $(VisualStudioVersion) 导入任务的适当版本:

<PropertyGroup>

    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
</PropertyGroup>
<UsingTask 
        TaskName="TransformXml" 
        AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />

从 .net 4.5 开始,该$(VisualStudioVersion)属性由 MSBuild 设置(最高可用)。查看详情Sayed Hasimy 博客

于 2013-10-27T19:45:09.250 回答