Използвам широко 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[]“.