Chr*_*sen 6 msbuild msbuild-4.0
我正在为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>
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿不硬编码那条路.
如果我只是使用<Reference Include="System.ServiceProcess.dll" />,我会收到一个错误:MSB3755: Could not find reference "System.ServiceProcess.dll"所以我想我必须在这里使用完整路径.
该$(FrameworkPathOverride)属性已包含正确的路径,因此我尝试使用它:
<Reference Include="$(FrameworkPathOverride)\System.ServiceProcess.dll" />
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
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" />
Run Code Online (Sandbox Code Playgroud)
但是,这会失败并报告搜索路径的相同错误%28x86%29:
<PropertyGroup>
<MyPath>$(FrameworkPathOverride)</MyPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
只是为了踢,我也试过这个变化,也失败了同样的错误:
<PropertyGroup>
<MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
此外,在所有情况下,输出<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>
Run Code Online (Sandbox Code Playgroud)
这似乎是一个众所周知的问题,标题为"MSBuild 4.0 UsingTask不能有带括号的路径":http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have- 一个路径与-括号
不幸的是,我没有机会测试这个.
| 归档时间: |
|
| 查看次数: |
1252 次 |
| 最近记录: |