Can vs.net 2010 / msbuild Products XMLSerializers для .NET 3.5 SP1?
-
30-09-2019 - |
Вопрос
Я просто обновил решение VS 2008, содержащую WinForms, общие библиотеки использования и веб-приложение в VS 2010, но все проекты все еще предназначены .NET 3.5 SP 1. Я использую Эта техника Для генерации XMLSerializers для моих общих библиотек используются. Приложение WinForms работает нормально. Когда мое веб-приложение пытается запустить использование этих библиотек, которые ссылаются на одни и те же XMLSerializers, оно бросает следующее:
Ошибка сервера в приложении «/ WebsUbscribers». Не удалось загрузить файл или сборку 'ceoimage.basecamp.xmlserializers или один из его зависимостей. Эта сборка построена за счет времени выполнения, чем в данный момент загруженного текущего времени выполнения и не может быть загружена. Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации о ошибке и где она возникла в коде.
Детали исключения: System.badimageFormatexception: не может загрузить файл или сборку «ceoImage.baseCamp.xmlserializers» или одну из его зависимостей. Эта сборка построена за счет времени выполнения, чем в данный момент загруженного текущего времени выполнения и не может быть загружена.
Я посмотрел на ссылки XMLSerializer, используя .Net отражатель и увидеть его ссылки как версии 2.0, так и 4.0 mscorlib
а также версии 3.5 и 4.0 System.Data.Linq
. Отказ Как ни странно, он использует только версию 4.0 System.Xml
. Отказ Это, вероятно, моя проблема прямо там.
Как я могу получить веб-приложение для бега с помощью этих XMLSerializers? Когда я просто удаляю эти XMLSerializers, веб-приложение работает нормально. Это вариант, но как я могу заставить Msbuild создавать сериализаторы для определенной версии CLR?
Вот задача MSBuild I добавляю к файлам проекта, которые заставляет создание 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>
Решение 3
Я обнаружил, что я могу явно указать путь инструмента задач SGEN, чтобы использовать версию 3.5, например:
<SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin">
Другие советы
MSBUILD 4 WILL (должен ...) Используйте 3.5 Инструменты для создания 3.5 проектов. Тем не менее, похоже, он не может работать, где инструменты 3.5 являются и используют инструменты 4.0. Результатом заключается в том, что он правильно создает ваш проект 3.5 (с помощью узлов CLR 2.0.50727), но инструмент 4.0 SGEN.exe генерирует CEOIMAGE.BASECAMP.xmlserializers.dll в виде сборки CLR 4.0.30319.
MSBuild использует реестр, чтобы получить путь к инструментам V3.5. Задачи MSBUILD, которые требуют инструментов SDK V3.5, вернутся к пути V4.0, если путь к инструментам 3.5 не может быть идентифицирован - посмотрите на логику, используемую для установки свойства TargetFrameWorksDkToolsdirectory в C: Windows Microsoft. Net framework v4.0.30319 microsoft.netframework.props, если вы действительно заинтересованы.
Вы можете диагностировать и исправлять возможные проблемы реестра следующим образом:
Установите монитор процесса и настроить фильтр для монитора доступа к реестру MSBUILD (класс событий: реестр, имя процесса: msbuild.exe, все типы результатов)
Запустить свою сборку
Процесс поиска Монитор для доступа RegqueryValue Соответствие доступа «Msbuild Toobsorversions 4.0 SDK35Toolspath». Обратите внимание, что это может быть под любом «HKEY_LOCAL_MACHINE Software Microsoft», либо «HKEY_LOCAL_MACHINE SPRACLE WOW6432NODE Microsoft»
Если в реестре посмотрите на этот ключ, вы увидите, что он псевдонизирует другое значение реестра, например, «$ (реестр: HKEY_LOCAL_MACHINE Software Microsoft Microsoft SDKS Windows v7.1 Winsdk-netfx35Tools-x86 @ AnttroundFolder) «Вскоре после этого вы, вероятно, увидите, что« имя не найдено », как MSBuild пытается загрузить значение из указанного ключа.
Должно быть понятно, какие ключи нужно добавить / изменить отсюда.
Есть несколько возможных причин, по которым значения реестра неверны. В моем случае проблема с установкой Microsoft SDK V7.1 означала, что ключевые ключи реестра были названы неправильно, которая была идентифицирована как ошибка здесь:
Вы зависит от всего 4.0 конкретно?
Если вы вызываете MSBUILD 4.0, вы получите 4,0 инструменты. Если вы призываете MSBUILD 3.5, вы получите 3.5 Инструменты (что вы хотите, насколько вы четко размещаете в 2,0 CLR).
Другой вариант - поставить 4,0 CLR на вашем веб-сервере. Если это не открыто, вы не должны иметь 4,0 целенаправленные вещи в вашем потоке.