Я только что обновил решение VS 2008, содержащее WinForms, библиотеки общего пользования и веб-приложение, до VS 2010, но все проекты по-прежнему ориентированы на .NET 3.5 SP 1. Я использую этот метод для создания XmlSerializer для моих библиотек общего назначения. Приложение WinForms работает нормально. Когда мое веб-приложение пытается запустить с использованием этих библиотек, которые ссылаются на те же XmlSerializers, оно выдает следующее:
Ошибка сервера в приложении '/ WebSubscribers'. Не удалось загрузить файл или сборку Ceoimage.Basecamp.XmlSerializers или одну из ее зависимостей. Эта сборка создается более новой средой выполнения, чем текущая загруженная среда выполнения, и не может быть загружена. Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.
Сведения об исключении: System.BadImageFormatException: не удалось загрузить файл или сборку Ceoimage.Basecamp.XmlSerializers или одну из ее зависимостей. Эта сборка создается более новой средой выполнения, чем текущая загруженная среда выполнения, и не может быть загружена.
Я просмотрел ссылки на XmlSerializer с помощью .NET Reflector и увидел, что он ссылается как на версии 2.0 и 4.0 mscorlib
, так и на версии 3.5 и 4.0 System.Data.Linq
. Как ни странно, он использует только версию System.Xml
4.0. Это, наверное, моя проблема прямо здесь.
Как я могу запустить веб-приложение с помощью этих XmlSerializer? Когда я просто удаляю эти XmlSerializers, веб-приложение работает нормально. Это вариант, но как я могу заставить MSBUILD создавать сериализаторы для определенной версии CLR?
Вот задача MSBuild, которую я добавляю в файлы проекта, которая вызывает создание XmlSerializers:
<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>