Предварительная генерация XmlSerializer с использованием Sgen и ILMerge. Беда с массивами - PullRequest
4 голосов
/ 04 декабря 2009

Я широко использую XmlSerializer и вместо того, чтобы позволять .NET генерировать необходимые сборки сериализации во время выполнения, я бы хотел сгенерировать эти сборки заранее и связать их с моим приложением. Я могу использовать Sgen для генерации этих сборок во время сборки. Кроме того, я должен запускать Sgen отдельно для каждого типа массива, который я сериализую (используя sgen / t: Foo []). Наконец, я использую ILMerge для объединения классов сериализации типа массива в сборку Foo.XmlSerializers.dll. Я проверил с помощью ildasm, что Foo.XmlSErializers.dll действительно содержит все объединенные классы.

Во время выполнения .NET успешно загружает FooSerializer из Foo.XmlSerializers.dll, не вызывая csc и не создавая временную сборку. Однако .NET не удается загрузить ArrayOfFooSerializer из той же библиотеки DLL и фактически вызывает csc.

Как успешно сгенерировать типы сериализации для массивов?

Рассмотрим следующие 2 сборки и их упрощенное содержание:

Сборка: MyApp.exe

public class MyApp
{
    public static int Main(string[] args)
    {
        new XmlSerializer(typeof(Foo));
        new XmlSerializer(typeof(Foo[]));
    }
}

Сборка: Foo.dll

public class Foo
{

}

Дополнительная информация:

Следующий app.config вызывает добавление событий, связанных с XmlSerialization, в журнал событий

<configuration>
  <system.diagnostics> 
    <switches> 
      <add name="XmlSerialization.PregenEventLog" value="1" />
      <add name="XmlSerialization.Compilation" value="1" />
    </switches> 
  </system.diagnostics>
</configuration>

Я не вижу событий для типа Foo. Я вижу следующее сообщение для Foo []:

Предварительно сгенерированный сериализатор Срок действия Foo.XmlSerializers истек. Вы нужно заново сгенерировать сериализатор для 'Foo [].

Ответы [ 2 ]

5 голосов
/ 04 марта 2010

Ваша проблема может быть связана с тем, что вы запустили ILMerge. Сгенерированная сборка сериализации отслеживает точную версию сборки, из которой она была сгенерирована, и сообщит, что срок ее действия истек, если есть какая-либо разница (даже если только в коде, а не в интерфейсе). Оказывается, ILMerge изменяет этот идентификатор сборки, что может быть причиной этого. См. Этот пост для получения дополнительной информации о проблеме .

3 голосов
/ 23 июля 2010

Вы можете попробовать посмотреть на sgen из Mono, он позволяет генерировать сборку сериализации для нескольких типов одновременно.

...