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

MSBuild内联任务引用有时是转义括号,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,我正在为MSBuild编写一个内联任务。它需要对System.ServiceProcess.dll的引用 如果我对System.ServiceProcess.dll文件的路径进行硬编码,任务将非常有效,如下所示: <UsingTask TaskName="MyTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">

我正在为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>
但这给了我一个错误:

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

注意它是如何转义到
%28x86%29

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

我也尝试过这种变化,但也失败了,出现了同样的错误:

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

$([System.Convert]::ToString($(FrameworkPathOverride)”)
此外,在所有情况下,
的输出都是相同的。
任务没有从
$(FrameworkPathOverride)
中的括号中转义,但是
是。嗯

为什么
(x86)
变为
%28x86%29
内部
而不是内部

为什么会发生在
$(FrameworkPathOverride)
而不是
$(MyPath)

如果它引用了
$(FrameworkPathOverride)
,为什么它开始出现在
$(MyPath)


如何避免硬编码此路径?

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

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

$([MSBuild]::Unescape($(FrameworkPathOverride)”)
这似乎是一个名为“MSBuild 4.0 UsingTask不能有带括号的路径”的已知问题:


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

我遇到了一个类似的问题,并用[MSBuild]:Unescape解决了它。我甚至无法获得一个硬编码的工作路径。我的任务中有类似于
的文件,但是构建项目总是告诉我它找不到文件。有什么想法吗?
<PropertyGroup>
    <MyPath>$(FrameworkPathOverride)</MyPath>
</PropertyGroup>
<PropertyGroup>
    <MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
<PropertyGroup>
    <MyPath>$([MSBuild]::Unescape("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>