2012-02-26 12 views
14

Estoy utilizando la nueva tarea en línea de MSBuild para aprovechar TransformXml (Transformada XDT) en el ensamblaje Microsoft.Web.Publishing.Tasks.dll.Tarea en línea de MSBuild: ensambles no estándar de Microsoft

Esto es lo que (cortado con tijeras) se ve mi tarea como:

<Task> 
    <Reference Include="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 
    <Reference Include="System.Xml" /> 
    <Using Namespace="System"/> 
    <Using Namespace="System.Linq"/> 
    <Using Namespace="System.IO" /> 
    <Using Namespace="System.Xml"/> 
    <Using Namespace="Microsoft.Web.Publishing.Tasks"/> 
    <Code Type="Fragment" Language="cs">...</Code> 
</Task> 

Este compila bien y se carga la DLL, sin embargo, cuando se ejecuta como un error porque está tratando de encontrar el conjunto en el camino AppBase que es : C:\Windows\Microsoft.NET\Framework\v4.0.30319. Hubiera esperado que mirara el camino que le di.

registro Fusión muestra esto:

=== Pre-bind state information ===\r 
    LOG: User = xxx\Kamran\r 
    LOG: DisplayName = Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
    (Fully-specified)\r 
    LOG: Appbase = file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/\r 
    LOG: Initial PrivatePath = NULL\r 
    Calling assembly : (Unknown).\r 
    ===\r 
    LOG: This bind starts in default load context.\r 
    LOG: Using application configuration file: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.Config\r 
    error MSB4018: LOG: Using host configuration file: \r 
    error MSB4018: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.\r 
    error MSB4018: LOG: Post-policy reference: Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.DLL.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.DLL.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.EXE.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.EXE.\r 

¿Hay alguna manera de arreglar esto o voy a ser obligado a crear un ensamblado de tarea en su lugar?

+0

Informe de error que se cerró incorrectamente: [MSBuild: ruta utilizada para la referencia de tareas en línea no se respeta] (https://connect.microsoft.com/VisualStudio/feedback/details/768289/msbuild-path-used-for- inline-task-reference-is-not-honored). Reenvío: [MSBuild: la ruta utilizada para referencia de tareas en línea no se respeta (toma 2)] (https://connect.microsoft.com/VisualStudio/feedback/details/2285231) – Stijn

+0

Microsoft ha reproducido el error, usted puede seguir su progreso en https://github.com/Microsoft/msbuild/issues/594 – Stijn

Respuesta

3

Todavía me gustaría una respuesta real a esto, pero pude solucionar este problema utilizando la reflexión y simplemente cargando el conjunto.

Puedes ver la fuente completa in my gist.

0

De acuerdo con este artículo en Dzone: Web.config transformations debe agregar

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 

justo a la cabeza del archivo de MSBuild. Parece que MSBuild no lo encuentra y trata de cargar desde GAC

0

Otra alternativa es usar AppDomain.AssemblyResolve. Sin embargo, tendrá que registrar su manejador antes de que el marco necesite el ensamblaje.

Esto se puede hacer poniendo todo en un delegado de acción dentro del fragmento. Otra posibilidad es establecer el atributo 'Tipo' del elemento 'Código' en 'clase' en lugar de 'fragmento'.

Para obtener información sobre el uso de AssemblyResolve, ya existe un artículo sobre stackoverflow: How to add folder to assembly search path at runtime in .NET?.

Todavía no es ideal, pero en mi caso es más limpio que el reflejo.

Cuestiones relacionadas