我正在为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="..." />
是。 HMM。
为什么(x86)
在%28x86%29
内变为<Reference />
但在<Message />
内变为$(FrameworkPathOverride)
?
为什么$(MyPath)
而不是$(MyPath)
呢?
如果引用$(FrameworkPathOverride)
?
如何避免对此路径进行硬编码?
答案 0 :(得分: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-a-path-with-parentheses
不幸的是,我没有机会对此进行测试。