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

Chr*_*sen 6 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>
Run Code Online (Sandbox Code Playgroud)

但是,我宁愿不硬编码那条路.

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

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

<Reference Include="$(FrameworkPathOverride)\System.ServiceProcess.dll" />
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

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" />
Run Code Online (Sandbox Code Playgroud)

但是,这会失败并报告搜索路径的相同错误%28x86%29:

<PropertyGroup>
    <MyPath>$(FrameworkPathOverride)</MyPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

<PropertyGroup>
    <MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

此外,在所有情况下,输出<Message Text="$(FrameworkPathOverride)" /><Message Test="$(MyPath)" />相同.该<Message />任务不是逃避括号内$(FrameworkPathOverride),但<Reference Include="..." /> .嗯.

为什么会(x86)变成%28x86%29里面<Reference />而不是里面<Message />

为什么会这样,$(FrameworkPathOverride)而不是为了$(MyPath)

$(MyPath)如果它引用它为什么会开始发生$(FrameworkPathOverride)

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

Ada*_*urd 5

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

<PropertyGroup>
    <MyPath>$([MSBuild]::Unescape("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

这似乎是一个众所周知的问题,标题为"MSBuild 4.0 UsingTask不能有带括号的路径":http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have- 一个路径与-括号

不幸的是,我没有机会测试这个.