Я только что обновил решение VS 2008, содержащее WinForms, общедоступные библиотеки и веб-приложение для VS 2010, но все проекты по-прежнему нацелены на .NET 3.5 SP 1. Я использую эту технику, чтобы генерировать XmlSerializers для моих общих библиотек. Приложение 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
. Как ни странно, он использует только версию 4.0 System.Xml
. Вероятно, это моя проблема.
Как я могу запустить веб-приложение с помощью этих XmlSerializers? Когда я просто удаляю эти 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>