Я широко использую 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 [].