2009-12-04 11 views
4

J'utilise beaucoup XmlSerializer et plutôt que de permettre à .NET de générer les assemblages de sérialisation nécessaires à l'exécution, je voudrais générer ces assemblages à l'avance et les regrouper avec mon application. Je suis capable d'utiliser Sgen pour générer ces assemblages au moment de la construction. De plus, je dois exécuter Sgen séparément pour chaque type de tableau que je sérialiserai (en utilisant sgen/t: Foo []). Enfin, j'utilise ILMerge pour fusionner les classes de sérialisation de type tableau dans l'assembly Foo.XmlSerializers.dll. J'ai vérifié avec ildasm que Foo.XmlSErializers.dll contient en fait toutes les classes fusionnées.Pré-génération de XmlSerializers avec Sgen et ILMerge. Problème avec les tableaux

Lors de l'exécution, .NET charge correctement FooSerializer à partir de Foo.XmlSerializers.dll sans invoquer csc et générer un assembly temporaire. Toutefois, .NET ne parvient pas à charger ArrayOfFooSerializer à partir de la même DLL et appelle en fait csc.

Comment pré-générer avec succès des types de sérialisation pour des tableaux?

Tenir compte des 2 assemblées et leur contenu simplifié suivants:

Assemblée: MyApp.exe

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

Assemblée: Foo.dll

public class Foo 
{ 

} 

Plus d'infos:

Le Après app.config, les événements liés à XmlSerialization sont ajoutés à e Journal des événements

<configuration> 
    <system.diagnostics> 
    <switches> 
     <add name="XmlSerialization.PregenEventLog" value="1" /> 
     <add name="XmlSerialization.Compilation" value="1" /> 
    </switches> 
    </system.diagnostics> 
</configuration> 

Je ne vois aucun événement pour le type Foo. Je vois le message suivant pour Foo []:

sérialiseur prégénérés 'Foo.XmlSerializers' a expiré. Vous besoin de re-générer le sérialiseur pour 'Foo []'.

Répondre

5

Votre problème peut être dû au fait que vous avez exécuté ILMerge. L'assembly de sérialisation que vous générez suit la version exacte de l'assembly à partir duquel il a été généré et indique qu'il a expiré s'il y a une différence (même si ce n'est que dans le code et non dans l'interface). Il s'avère que ILMerge modifie cet ID d'assembly, ce qui pourrait être à l'origine de cela. See this post for more information about the problem.

3

Vous pourriez essayer de regarder sgen à partir de Mono, il permet de générer un ensemble de sérialisation pour plusieurs types à la fois.