4 Stimmen

Vorgenerierung von XmlSerializern mit Sgen und ILMerge. Probleme mit Arrays

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.

6voto

Nick Punkte 5805

Ihr Problem kann tatsächlich auf die Tatsache zurückzuführen sein, dass Sie ILMerge ausgeführt haben. Die von Ihnen generierte Serialisierungsbaugruppe verfolgt die genau Version der Baugruppe, aus der sie erzeugt wurde, und meldet, dass sie abgelaufen ist, wenn es einen Unterschied gibt (auch wenn nur im Code und nicht in der Schnittstelle). Wie sich herausstellt, ändert ILMerge diese Assembly ID, was dies verursachen könnte. Weitere Informationen zu diesem Problem finden Sie in diesem Beitrag .

3voto

Juozas Kontvainis Punkte 9051

Sie könnten versuchen, sgen von Mono zu betrachten, es ermöglicht die Erzeugung von Serialisierungs-Assembly für mehrere Typen auf einmal.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X