Wstępne generowanie XmlSerializers przy użyciu Sgen i ILMerge. Problemy z tablicami
Używam XmlSerializer w szerokim zakresie i zamiast pozwalać .NET na generowanie niezbędnych zestawów serializacji w czasie wykonywania, chciałbym wygenerować te zespoły z wyprzedzeniem i połączyć je z moją aplikacją. Jestem w stanie użyć Sgen do generowania tych zespołów w czasie kompilacji. Dodatkowo muszę uruchamiać Sgen oddzielnie dla każdego typu tablicy, który będę serializować (używając sgen / t: Foo []). Na koniec używam ILMerge do łączenia klas serializacji typu tablicowego z zestawem Foo.XmlSerializers.dll. Sprawdziłem z ildasmą, że Foo.XmlSErializers.dll faktycznie zawiera wszystkie połączone klasy.
W środowisku wykonawczym .NET pomyślnie ładuje FooSerializer z Foo.XmlSerializers.dll bez wywoływania csc i generowania tymczasowego zespołu. Jednak .NET nie może załadować ArrayOfFooSerializer z tej samej biblioteki DLL i faktycznie wywołuje csc.
Jak mogę pomyślnie wstępnie generować typy serializacji dla tablic?
Rozważ następujące 2 zespoły i ich uproszczoną zawartość:
Zgromadzenie: MyApp.exe
public class MyApp
{
public static int Main(string[] args)
{
new XmlSerializer(typeof(Foo));
new XmlSerializer(typeof(Foo[]));
}
}
Złożenie: Foo.dll
public class Foo
{
}
Dalsze informacje:
Następujące app.config powoduje, że zdarzenia związane z XmlSerialization zostaną dodane do dziennika zdarzeń
<configuration>
<system.diagnostics>
<switches>
<add name="XmlSerialization.PregenEventLog" value="1" />
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
</configuration>
Nie widzę wydarzeń dla typu Foo. Widzę następujący komunikat dla Foo []:
Wygenerowany wcześniej serializator „Foo.XmlSerializers” wygasł. Musisz ponownie wygenerować serializator dla „Foo []”.