2010-01-21 22 views
7

Tengo un proceso de compilación que toma mi proyecto ASP.NET 2.0 ASP.NET VS 2008 y lo construye usando MSBuild. El proyecto contiene archivos ASPX, además de un servicio web, y también se conecta a otro servicio web;)¿Por qué MSBuild coloca el ensamblado * .XmlSerializers.dll en la carpeta raíz de la aplicación web publicada?

Todo parece funcionar bien excepto que MSBuild coloca el archivo de ensamblaje * .XmlSerializers.dll en la carpeta _PublishedWebsites \ MySite en lugar de _PublishedWebsites \ MySite \ bin como lo hace con el otro dll.

¿Importa que el archivo de ensamblaje * .XmlSerializers.dll no esté en la carpeta bin?

¿O debería usar mi proceso de compilación para copiar el ensamblado * .XmlSerializers.dll en la carpeta bin después de que MSBuild haya finalizado?

Respuesta

6

No necesita este ensamblaje a menos que vaya a serializar y deserializar tipos de su ensamblaje. Este ensamblado es generado por el compilador para evitar que su aplicación lo genere una vez que esté en funcionamiento.

Si tiene la intención de hacer una serialización, conserve el ensamblaje ya que ayudará con el rendimiento. Si no tiene la intención de realizar ninguna serialización, siéntase libre de ignorarla o eliminarla por completo.

Para obtener más información sobre esta práctica consulte XML Serializer Generator Tool:

El serializador XML generador crea un ensamblado de serialización XML para tipos en un ensamblado especificado con el fin para mejorar el rendimiento de inicio de un XmlSerializer cuando serializa o deserializa objetos de los tipos especificados.

+0

Gracias. Utilizo la serialización para convertir algunas de mis clases en XML y viceversa. Lo que no entiendo es si debo mover el ensamblado * .XmlSerializers.dll a la carpeta bin o dejarlo en la carpeta base de la aplicación web. –

+1

Moverlo al directorio '\ bin' para que CLR lo pueda encontrar. –

2

Sí, importa que el conjunto de XmlSerializers no esté en el directorio bin. Utilizando Fusion Log Viewer, confirmé mi sospecha de que la DLL no se estaba cargando cuando se dejó en la raíz de la aplicación web.

Para corregir esto, puede agregar un objetivo de AfterBuild que mueva el archivo a la ubicación correcta. Puedo usar el siguiente fragmento, pero las nuevas versiones de MSBUILD tienen una tarea Mover:

<Target Name="AfterBuild"> 
    <!-- Don't do this when the final destination is the same as build destination (local builds) --> 
    <Exec Command="move /Y &quot;$(WebProjectOutputDir)\$(AssemblyName).XmlSerializers.dll&quot; &quot;$(WebProjectOutputDir)\bin&quot;" Condition="'$(OutDir)' != '$(OutputPath)'"/> 
    </Target> 

Nota: Si usted está construyendo y ejecutando la aplicación web desde el mismo directorio (como suele ser el caso cuando se ejecuta localmente en su dev máquina) y tiene la configuración del proyecto "Generar ensamblaje de serialización" en Encendido, el archivo se genera en el directorio bin. Es por eso que configuré la tarea que no se debe ejecutar en ese caso.

Pude simplemente haberme asegurado de que el archivo existiera, pero quería asegurarme de que la compilación fallaba si por alguna razón el archivo no estaba en el lugar esperado durante las compilaciones de integración.

Cuestiones relacionadas