Создание сборки Xml Serialization как части моей сборки

Этот код создает исключение FileNotFoundException, но в конечном итоге работает без проблем:

void ReadXml() { XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); //... } 

Вот исключение:


Первое исключение исключения типа «System.IO.FileNotFoundException» произошло в mscorlib.dll

Дополнительная информация: Не удалось загрузить файл или сборку «MyAssembly.XmlSerializers, Version = 1.4.3190.15950, Culture = neutral, PublicKeyToken = null» или одну из его зависимостей. Система не может найти указанный файл.


Похоже, что структура автоматически генерирует сборку сериализации, если она не найдена. Я могу сгенерировать его вручную, используя sgen.exe, что облегчает исключение.

Как получить визуальную студию для автоматической сборки сборки XML-сериализации?


Обновление: assembly сериализации сборки: при настройке ничего не отображается.

Так мне удалось это сделать, изменив скрипт MSBUILD в моем файле .CSPROJ:

Сначала откройте файл .CSPROJ как файл, а не как проект. Прокрутите до нижней части файла, пока не найдете этот код с комментариями, незадолго до закрытия тега Project:

  

Теперь мы просто вставляем нашу собственную цель AfterBuild, чтобы удалить любой существующий XmlSerializer и SGen наши собственные, например:

        

Это подходит для меня.

Как объяснил Мартин в своем ответе , включение генерации сериализации через свойства проекта недостаточно, потому что задача SGen добавляет переключатель /proxytypes в командную строку sgen.exe.

Microsoft имеет документальное свойство MSBuild, которое позволяет отключить переключатель /proxytypes и заставляет SGen Task генерировать сборки сериализации, даже если в сборке нет прокси-типов.

SGenUseProxyTypes

Булевское значение, указывающее, должны ли генерироваться типы прокси-сервера SGen.exe. objective SGen использует это свойство для установки флажка UseProxyTypes. Это свойство по умолчанию имеет значение true, и для его изменения нет пользовательского интерфейса. Чтобы сгенерировать сборку сериализации для типов, отличных от webservice, добавьте это свойство в файл проекта и установите для него значение false перед импортом Microsoft.Common.Targets или C # / VB.targets

Как указано в документации, вы должны вручную изменить файл проекта, но вы можете добавить свойство SGenUseProxyTypes в свою конфигурацию, чтобы включить генерацию. Конфигурация ваших проектов будет выглядеть примерно так:

    On false    On false  

Другие ответы на этот вопрос уже упоминались в настройках Project Properties-> Build-> Generate Serialization Assemblies, но по умолчанию это приведет к генерации сборки только в том случае, если в проекте есть « прокси-серверы веб-служб XML ».

Лучший способ понять точное поведение Visual Studio – проверить цель GenerateSerializationAssemblies в файле C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 ** Microsoft.Common.targets **.

Вы можете проверить результат этой задачи сборки из windows вывода Visual Studio и выбрать « Построить из выпадающего списка » из раскрывающегося списка. Вы должны увидеть что-то похожее

C: \ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ bin \ sgen.exe / assembly : D :\Temp\LibraryA\obj\Debug\LibraryA.dll / proxytypes / reference: .. / компилятор: / delaysign- LibraryA -> D: \ Temp \ LibraryA \ bin \ Debug \ LibraryA.dll

Ключевым моментом здесь является переключатель / proxytypes . Вы можете прочитать о различных переключателях для инструмента генератора XML Serializer (Sgen.exe)

Если вы знакомы с MSBuild, вы можете настроить цель GenerateSerializationAssemblies, чтобы задача SGen имела атрибут UseProxyTypes = «false» вместо true, но тогда вам необходимо взять на себя все связанные с этим обязанности по настройке системы Visual Studio / MSBuild. В качестве альтернативы вы можете просто расширить процесс сборки, чтобы вызвать SGen вручную без переключателя / proxytypes.

Если вы прочтете документацию для SGen, то достаточно ясно, что Microsoft хотела ограничить использование этого средства. Учитывая объем шума в этой теме, довольно ясно, что Microsoft не очень хорошо справлялась с документированием опыта Visual Studio. Для этой проблемы есть элемент Connect Feedback, и ответ невелик.

создание нового определения задачи sgen ломает муху на колесе. просто установите необходимые переменные, чтобы задача работала по назначению. Во всяком случае, в документации Microsoft нет важной информации.

Шаги по созданию сборщиков сериализации

(с частями от http://msdn.microsoft.com/en-us/library/ff798449.aspx )

  1. В Visual Studio 2010 в обозревателе решений щелкните правой кнопкой мыши проект, для которого вы хотите создать сборки сериализации, а затем нажмите «Выгрузить проект».
  2. В обозревателе решений щелкните правой кнопкой мыши проект, для которого вы хотите создать сборки сериализации, а затем нажмите «Изменить .csproj».
  3. В файле .csproj сразу после v?.? добавьте следующие элементы:

    false $(Platform)

  4. В файле .csproj в каждой конфигурации платформы

    например

    добавьте следующую строку:

    On

  5. Сохраните и закройте файл .csproj.

  6. В обозревателе решений щелкните правой кнопкой мыши только что отредактированный проект и нажмите «Обновить проект».

Эта процедура создает дополнительную сборку с именем .xmlSerializers.dll в выходной папке. Вам нужно будет развернуть эту сборку с вашим решением.


объяснение

SGen по умолчанию только для типов прокси генерирует «Any CPU». Это происходит, если вы не зададите соответствующие переменные в файле проекта.

SGenPlatformTarget требуется для соответствия вашей PlatformTarget. Я склонен думать, что это ошибка в шаблоне проекта. Почему целевая платформа sgen отличается от вашего проекта? Если это произойдет, вы получите исключение во время выполнения

0x80131040: определение манифеста размещенной сборки не соответствует ссылке на сборку

Вы можете определить определение задачи msbuild, проанализировав файл проекта:

  

где MSBuildToolsPath зависит от вашего http://msdn.microsoft.com/en-us/library/bb397428.aspx

Просмотрите определение задачи SGen для TargetFrameworkVersion 4.0 из

Путь установки Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets

для просмотра недокументированных переменных, таких как $ (SGenPlatformTarget), вы можете указать в своем файле проекта

      

В случае, если кто-то другой столкнется с этой проблемой внезапно после того, как все работает нормально раньше: для меня это связано с тем, что флажок «Включить только мой код (только управляемый)» не установлен в меню опций (Options -> Debugging) (который был автоматически отключается после установки .NET Reflector).

EDIT: То есть, конечно, это исключение происходило раньше, но когда «включить только мой код» отключен, помощник отладки (если он включен) остановится в этот момент при броске.

Я немного опоздал на вечеринку, но с трудом работал с предыдущим ответом. В частности, Visual Studio будет сбой при каждом просмотре свойств моего проекта. Я полагаю, это объясняется тем, что он больше не понимал, как читать файл csproj. Тем не менее …

Добавьте в командную строку события post-build следующее:

 "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe" "$(TargetPath)" /force 

Это позволит использовать sgen.exe непосредственно для восстановления сборки Xml Serialization каждый раз, когда вы создаете проект для Debug или Release.

Посмотрите в свойствах решения. На вкладке «Сборка» внизу находится выпадающий список «Создание сборки сериализации»,

Немного другое решение, полученное от резервного копирования мозга, может заключаться в том, чтобы прямо указать целевую платформу, где вы должны использовать ее так:

   $(Platform)   $(PlatformTarget)       
  • Сделать пользовательский class Serializable в Objective-c / iPhone?
  • использование атрибута XmlArrayItem без XmlArray в classе Serializable C #
  • XmlSerializer: удалить ненужные пространства имен xsi и xsd
  • Сериализовать свойство как атрибут Xml в элементе
  • Сериализация объекта как XML UTF-8 в .NET.
  • XSLT: как преобразовать XML-узел в строку
  • Как сериализовать объект в XML без получения xmlns = "..."?
  • Как я сериализую значение enum как int?
  • XmlSerializer, дающий FileNotFoundException в конструкторе
  • Сериализация объекта в XML
  • Использование StringWriter для сериализации XML
  • Давайте будем гением компьютера.