Я только что обновил VS 2008 решение, содержащее WinForms, общие библиотеки использования и веб-приложение для VS 2010, но все проекты по-прежнему нацелены на .NET 3.5 SP 1. Я использую this technique для генерации XmlSerializers для моих общих библиотек. Приложение WinForms работает нормально. Когда мой веб-приложение пытается выполнить с помощью этих библиотек, которые ссылаются на одни и те же XmlSerializers, он выдает следующее:Может ли VS.NET 2010/MSBUILD создавать XmlSerializers для .NET 3.5 SP1?
Ошибка сервера в приложение '/ WebSubscribers. Не удалось загрузить файл или сборка 'Ceoimage.Basecamp.XmlSerializers' или одна из его зависимостей. Эта сборка построена во время выполнения, но не более , загруженной в настоящее время, и не может быть загружена . Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса . Просмотрите трассу стека для получения дополнительной информации информацию об ошибке и по которой это код генерации кода.
Сведения об исключении: System.BadImageFormatException: Не удалось загрузить файл или сборку «Ceoimage.Basecamp.XmlSerializers» или одну из его зависимостей. Эта сборка построена с использованием среды выполнения, более новой, чем текущая загруженная среда выполнения и не может быть загружена.
Я посмотрел на ссылки на XMLSerializer, используя .NET Reflector и посмотреть, она ссылается как на версии mscorlib
2.0 и 4.0, а также 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>
следует добавить, что изменить в ответ, поэтому мы может проголосовать за это, это, кажется, лучшее решение :) – Lucas