MSBuild内联任务引用有时是转义括号
我正在为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">
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>