msbuild msbuild-4.0

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?