gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:14:24 25 4
gpt4 key购买 nike

我正在为 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): error MSB3754: The reference assembly "C:\Program Files %28x86%29\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ServiceProcess.dll" is invalid. "The given assembly name or codebase was invalid. (Exception from 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%29里面<Reference />但不在里面 <Message />

为什么 $(FrameworkPathOverride) 会发生这种情况?而不是$(MyPath)

为什么 $(MyPath) 会发生这种情况?如果它引用 $(FrameworkPathOverride)

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

最佳答案

与您上次的尝试类似,您是否尝试过使用“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

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

关于MSBuild 内联任务引用有时会转义括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17070743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com