Ich verwende XmlSerializer ausgiebig und anstatt dass .NET die notwendigen Serialisierungs-Assemblies zur Laufzeit generiert, möchte ich diese Assemblies im Voraus generieren und sie mit meiner Anwendung bündeln. Ich kann Sgen verwenden, um diese Assemblies zur Build-Zeit zu generieren. Außerdem muss ich Sgen für jeden Array-Typ, den ich serialisieren möchte, separat ausführen (mit sgen /t:Foo[]). Schließlich verwende ich ILMerge, um die Array-Typ-Serialisierungsklassen in die Baugruppe Foo.XmlSerializers.dll zusammenzuführen. Ich habe mit ildasm überprüft, dass Foo.XmlSErializers.dll in der Tat alle zusammengeführten Klassen enthält.
Zur Laufzeit lädt .NET erfolgreich FooSerializer aus Foo.XmlSerializers.dll, ohne csc aufzurufen und eine temporäre Assembly zu erzeugen. Allerdings schlägt .NET beim Laden von ArrayOfFooSerializer aus derselben DLL fehl und ruft in der Tat csc auf.
Wie kann ich erfolgreich Serialisierungstypen für Arrays vorgenerieren?
Betrachten Sie die folgenden 2 Baugruppen und ihren vereinfachten Inhalt:
Montage: MyApp.exe
public class MyApp
{
public static int Main(string[] args)
{
new XmlSerializer(typeof(Foo));
new XmlSerializer(typeof(Foo[]));
}
}
Montage: Foo.dll
public class Foo
{
}
Weitere Informationen:
Die folgende app.config bewirkt, dass XmlSerialization-bezogene Ereignisse zum Ereignisprotokoll hinzugefügt werden
<configuration>
<system.diagnostics>
<switches>
<add name="XmlSerialization.PregenEventLog" value="1" />
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
</configuration>
Ich sehe keine Ereignisse für den Typ Foo. Ich sehe die folgende Meldung für Foo[]:
Vorgenerierter Serialisierer Foo.XmlSerializers' ist ausgelaufen. Sie müssen den Serializer neu generieren für 'Foo[]' neu generieren.