2 votes

xmlserializer.dll n'est pas utilisé si l'assemblage cible change

Je suis en train de générer une dll xmlserializer pour mon service. Il s'agit d'un gros service web - la construction prend environ 2 minutes.

Pour réduire le temps de construction, j'ai séparé la construction du xmlserializer dans un projet Makefile séparé - étant donné que l'interface ne change pas, j'ai pensé que je pourrais le compiler une fois, et ce serait tout.

Mais, ce que j'ai constaté, c'est que si je recompile le service, le xmlserializer n'est plus utilisé et le code du serializer est généré au moment de l'exécution.

Quelqu'un a-t-il vu cela ? Existe-t-il une solution de contournement ? Pourquoi le xmlserializer ne correspond-il plus à l'assemblage du service ?

Merci.

Mise à jour :

Ok, j'ai trouvé la moitié de la réponse...

https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializerversionattribute(v=vs.110).aspx

Décrit l'attribut XmlSerializerVersionAttribute (qui se trouve dans le code .cs généré).

Le document dit...

Si l'infrastructure trouve un assembly avec un nom correspondant, l'assembly est chargé et l'infrastructure vérifie l'attribut XmlSerializerVersionAttribute pour une correspondance entre la version de l'assemblage trouvé et la version actuelle de l'assemblage parent . Si la version ne correspond pas, l'assemblage trouvé n'est pas utilisé. Au lieu de cela, un assemblage temporaire est généré pour la sérialisation.

Une recherche dans le code source de .Net Framework montre que le ParentAssemblyId est en fait l'identifiant de la version du module, à savoir

Assembly.GetExecutingAssembly().GetModules()[0].ModuleVersionId

Cependant, si je charge manuellement l'assemblage xmlserializer et que je modifie le champ ParentAssemblyId de l'attribut, cela ne fonctionne toujours pas. Je suppose que le framework charge sa propre copie de l'assemblage serializer.

0voto

Frank Points 31

J'ai fini par ajouter une étape après la construction pour changer l'id du module de l'assemblage (dans une construction de débogage).

J'ai essayé fody.MVID (comme décrit ici can-i-specify-the-module-version-id-mvid-when-building-a-net-assembly ), mais je n'ai pas réussi à le faire fonctionner (incompatibilité de versions).

En fin de compte, j'ai utilisé le code figurant dans cet article de blog. https://blogs.msdn.microsoft.com/johnls/2005/08/13/changing-mvids/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X