La referencia de la tarea en línea de MSBuild se escapa entre paréntesis, a veces
msbuild-4.0 (1)
De forma similar a su último intento, ¿ha intentado lo siguiente utilizando la función de propiedad MSBuild "Unescape"?
<PropertyGroup>
<MyPath>$([MSBuild]::Unescape("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
Parece ser un problema conocido titulado "MSBuild 4.0 UsingTask no puede tener una ruta entre paréntesis": http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have- a-path-with-parentheses
Desafortunadamente, no he tenido la oportunidad de probar esto.
Estoy escribiendo una tarea en línea para MSBuild. Requiere una referencia a System.ServiceProcess.dll
.
La tarea funciona bien si codigo la ruta al archivo System.ServiceProcess.dll, así:
<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>
Sin embargo, prefiero no codificar ese camino.
Si solo uso <Reference Include="System.ServiceProcess.dll" />
, MSB3755: Could not find reference "System.ServiceProcess.dll"
un error: MSB3755: Could not find reference "System.ServiceProcess.dll"
, así que creo que tengo que usar la ruta completa aquí.
La propiedad $(FrameworkPathOverride)
contiene la ruta correcta, así que traté de usar eso:
<Reference Include="$(FrameworkPathOverride)/System.ServiceProcess.dll" />
Pero eso me da un error:
C: / path / to / project.csproj (93,3): error MSB3754: el ensamblaje de referencia "C: / Archivos de programa% 28x86% 29 / Assemblies de referencia / Microsoft / Framework / .NETFramework / v4.5 / System.ServiceProcess .dll "no es válido. "El nombre del ensamblado o la base de código dados no son válidos. (Excepción de HRESULT: 0x80131047)" [C: / path / to / project.csproj]
Observe cómo escapó (x86)
a %28x86%29
.
Notablemente, parece hacer esto solo por $(FrameworkPathOverride)
. Si, en cambio, defino mi propiedad y la uso, funciona bien, a menos que esa propiedad también haga referencia a $(FrameworkPathOverride)
. En otras palabras, esto funciona (pero todavía tengo que codificar la ruta):
<PropertyGroup>
<MyPath>C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.5</MyPath>
</PropertyGroup>
// (later, inside <Task />)
<References Include="$(MyPath)/System.ServiceProcess.dll" />
Sin embargo, esto falla con el mismo error que informa buscar una ruta para %28x86%29
:
<PropertyGroup>
<MyPath>$(FrameworkPathOverride)</MyPath>
</PropertyGroup>
Solo por las patadas, también probé esta variación, que también falla con el mismo error:
<PropertyGroup>
<MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
Además, en todos los casos, el resultado de <Message Text="$(FrameworkPathOverride)" />
y <Message Test="$(MyPath)" />
son idénticos. La tarea <Message />
no escapa del paréntesis dentro de $(FrameworkPathOverride)
, pero la <Reference Include="..." />
es . Hmm.
¿Por qué (x86)
convierte en %28x86%29
dentro de <Reference />
pero no dentro de <Message />
?
¿Por qué ocurre con $(FrameworkPathOverride)
y no con $(MyPath)
?
¿Por qué comienza a pasar a $(MyPath)
si hace referencia a $(FrameworkPathOverride)
?
¿Cómo puedo evitar forzar la codificación de esta ruta?