我正在为 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%29
inside<Reference />
而不是 inside <Message />
?
为什么会发生$(FrameworkPathOverride)
而不是发生$(MyPath)
?
$(MyPath)
如果它引用它为什么会开始发生$(FrameworkPathOverride)
?
如何避免对这条路径进行硬编码?