6

我正在为 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="..." />

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

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

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

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

4

1 回答 1

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-带括号的路径

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

于 2013-06-13T14:33:41.553 回答