Вопрос

Я просто обновил решение 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 означала, что ключевые ключи реестра были названы неправильно, которая была идентифицирована как ошибка здесь:

http://connect.microsoft.com/visualstudio/feedback/details/594338/tfs-2010-build-agent-and-windows-7-1-sdk-targeting-net-3-5-ded-genate- Ресурсы

Вы зависит от всего 4.0 конкретно?

Если вы вызываете MSBUILD 4.0, вы получите 4,0 инструменты. Если вы призываете MSBUILD 3.5, вы получите 3.5 Инструменты (что вы хотите, насколько вы четко размещаете в 2,0 CLR).

Другой вариант - поставить 4,0 CLR на вашем веб-сервере. Если это не открыто, вы не должны иметь 4,0 целенаправленные вещи в вашем потоке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top