Vorgenerieren von XmlSerializers mit Sgen und ILMerge. Probleme mit Arrays

Ich benutze XmlSerializer ausgiebig und anstatt .NET zu erlauben, die erforderlichen Serialisierungsassemblys zur Laufzeit zu generieren, möchte ich diese Assemblys im Voraus generieren und mit meiner Anwendung bündeln. Ich kann Sgen verwenden, um diese Assemblys zum Zeitpunkt der Erstellung zu generieren. Außerdem muss ich Sgen für jeden zu serialisierenden Array-Typ separat ausführen (mit sgen / t: Foo []). Schließlich verwende ich ILMerge, um die Array-Serialisierungsklassen in der Assembly Foo.XmlSerializers.dll zusammenzuführen. Ich habe mit ildasm überprüft, dass Foo.XmlSErializers.dll tatsächlich alle zusammengeführten Klassen enthält.

Zur Laufzeit lädt .NET FooSerializer erfolgreich von Foo.XmlSerializers.dll, ohne csc aufzurufen und eine temporäre Assembly zu generieren. .NET kann ArrayOfFooSerializer jedoch nicht aus derselben DLL laden und ruft tatsächlich csc auf.

Wie kann ich Serialisierungstypen für Arrays erfolgreich vorgenerieren?

Betrachten Sie die folgenden 2 Assemblys und deren vereinfachten Inhalt:

Assembly: MyApp.exe

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

Assembly: Foo.dll

public class Foo
{

}

Weitere Informationen:

Die folgende app.config führt dazu, 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 Foo-Typ. Ich sehe die folgende Nachricht für Foo []:

Der vorgenerierte Serializer 'Foo.XmlSerializers' ist abgelaufen. Sie müssen den Serializer für 'Foo []' neu generieren.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage