Acabo de actualizar una solución VS 2008 que contiene WinForms, bibliotecas de uso general y una aplicación web para VS 2010, pero todos los proyectos aún se dirigen a .NET 3.5 SP 1. Utilizo this technique para generar XmlSerializers para mis bibliotecas de uso general. La aplicación WinForms funciona bien. Cuando mi aplicación web intenta ejecutar el uso de estas bibliotecas que hacen referencia a los mismos XmlSerializers, que arroja el siguiente:¿Puede VS.NET 2010/MSBUILD producir XmlSerializers para .NET 3.5 SP1?
Error de servidor en la aplicación '/' WebSubscribers. No se pudo cargar el archivo o el ensamblado 'Ceoimage.Basecamp.XmlSerializers' o una de sus dependencias. Este ensamblado está creado por un tiempo de ejecución más reciente que el tiempo de ejecución actualmente cargado y no puede tener cargado. Descripción: Ocurrió una excepción no controlada durante la ejecución de la solicitud web actual . Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó el código .
Detalles de la excepción: System.BadImageFormatException: No se pudo cargar el archivo o ensamblado 'Ceoimage.Basecamp.XmlSerializers' o una de sus dependencias. Este ensamblado está creado por un tiempo de ejecución más nuevo que el tiempo de ejecución cargado actualmente y no se puede cargar.
He mirado en las referencias de la XmlSerializer usando .NET Reflector y ver que hace referencia tanto a las versiones 2.0 y 4.0 de mscorlib
así como las 3.5 y 4.0 versiones de System.Data.Linq
. Extrañamente, solo usa la versión 4.0 de System.Xml
. Ese es probablemente mi problema allí mismo.
¿Cómo puedo hacer que la aplicación web se ejecute utilizando estos XmlSerializers? Cuando simplemente elimino esos XmlSerializers, la aplicación web funciona bien. Esta es una opción, pero ¿cómo puedo forzar a MSBUILD a crear serializadores para una versión específica del CLR?
Aquí es la tarea de MSBuild agrego a los archivos que obliga a la creación de los XmlSerializers proyectar:
<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
<Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
</Target>
se debe añadir esa edición como una respuesta así que puede votarlo, parece ser la mejor solución :) – Lucas