MSBuild内联任务引用有时是转义括号

时间:2013-06-12 16:33:37

标签: msbuild msbuild-4.0

我正在为MSBuild编写内联任务。它需要引用System.ServiceProcess.dll

如果我对System.ServiceProcess.dll文件的路径进行硬编码,那么该任务很有用,如下所示:

<UsingTask
    TaskName="MyTask"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <Task>
        <Reference Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ServiceProcess.dll" />
        <Code Type="Fragment" Language="cs">...working fine...</Code>
    </Task>
</UsingTask>

但是,我宁愿不对该路径进行硬编码。

如果我只使用<Reference Include="System.ServiceProcess.dll" />,我会收到错误:MSB3755: Could not find reference "System.ServiceProcess.dll",所以我想我必须在这里使用完整路径。

$(FrameworkPathOverride)属性已包含正确的路径,因此我尝试使用它:

<Reference Include="$(FrameworkPathOverride)\System.ServiceProcess.dll" />

但这给了我一个错误:

  

C:\ path \ to \ project.csproj(93,3):错误MSB3754:引用程序集“C:\ Program Files%28x86%29 \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.5 \ System.ServiceProcess.dll“无效。 “给定的程序集名称或代码库无效。(HRESULT异常:0x80131047)”[C:\ path \ to \ project.csproj]

请注意它如何将(x86)转换为%28x86%29

值得注意的是,它似乎仅针对$(FrameworkPathOverride)执行此操作。如果我定义自己的属性并使用它,它就可以正常工作,除非该属性也引用$(FrameworkPathOverride)。换句话说,这有效(但仍然让我对路径进行硬编码):

<PropertyGroup>
    <MyPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5</MyPath>
</PropertyGroup>

// (later, inside <Task />)
<References Include="$(MyPath)\System.ServiceProcess.dll" />

但是,此操作失败,报告搜索%28x86%29的路径时出现的错误相同:

<PropertyGroup>
    <MyPath>$(FrameworkPathOverride)</MyPath>
</PropertyGroup>

只是为了踢,我也尝试了这种变化,它也失败了同样的错误:

<PropertyGroup>
    <MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>

此外,在所有情况下,<Message Text="$(FrameworkPathOverride)" /><Message Test="$(MyPath)" />的输出都相同。 <Message />任务转义$(FrameworkPathOverride)内的括号,但<Reference Include="..." /> 。 HMM。

为什么(x86)%28x86%29内变为<Reference />但在<Message />内变为$(FrameworkPathOverride)

为什么$(MyPath)而不是$(MyPath)呢?

如果引用$(FrameworkPathOverride)

,为什么它会在{{1}}开始发生?

如何避免对此路径进行硬编码?

1 个答案:

答案 0 :(得分:5)

与上次尝试类似,您是否使用“Unescape”MSBuild属性函数尝试了以下操作?

<PropertyGroup>
    <MyPath>$([MSBuild]::Unescape("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>

这似乎是一个名为“MSBuild 4.0 UsingTask不能有括号的路径”的已知问题:http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have-a-path-with-parentheses

不幸的是,我没有机会对此进行测试。