FileNotFoundException pour mscorlib.XmlSerializers.DLL, ce qui n'existe pas

j'utilise un XmlSerializer pour désérialiser un type particulier de mscorelib.dll

XmlSerializer ser = new XmlSerializer( typeof( [.Net type in System] ) );
return ([.Net type in System]) ser.Deserialize( new StringReader( xmlValue ) );

cela lance une prise FileNotFoundException lorsque l'ensemble est chargé:

" ne pouvait pas charger le fichier ou l'assemblage "mscorlib.Xmlserialiseurs, Version=2.0.0.0, Culture=neutre, Publiceytoken=b77a5c561934e089 " ou l'une de ses dépendances. Système ne peut pas trouver le fichier spécifié."

FusionLog:

=== Pre-bind state information ===
LOG: User = ###
LOG: DisplayName = mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
 (Fully-specified)
LOG: Appbase = file:///C:/localdir
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:localdirbinDebugappname.vshost.exe.Config
LOG: Using machine configuration file from c:WINDOWSMicrosoft.NETFrameworkv2.0.50727configmachine.config.
LOG: Post-policy reference: mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers.EXE.
LOG: Attempting download of new URL file:///C:/localdir/bin/Debug/mscorlib.XmlSerializers/mscorlib.XmlSerializers.EXE.

autant Que je sache, il n'y a pas de mscorlib.XmlSerializers.DLL, je pense que le nom DLL a été généré automatiquement par.Net à la recherche de serializer.

vous avez la possibilité de créer une myApplication.XmlSerializers.DLL lors de la compilation pour optimiser les sérialisations, donc je suppose que cela fait partie de la vérification du framework.

le problème est que cela semble causer un retard dans le chargement de l'application - il semble se bloquer pendant quelques secondes à ce point.

des idées pour éviter cela ou accélérer?

11
demandé sur starblue 2008-08-15 15:03:30

3 réponses

je suppose maintenant. mais:

  1. le système pourrait générer un sérialiseur pour l'ensemble de mscorlib, qui pourrait être très lent.
  2. vous pourriez probablement éviter cela en enveloppant le type de système dans votre propre type et en sérialisant qu'à la place - alors vous obtiendriez un sérialiseur pour votre propre assemblage.
  3. vous pourriez être en mesure de construire le serializer pour mscorlib avec sgen.exe, qui était l'ancienne façon de construire serializer dlls avant son intégration dans VS.
2
répondu Will Dean 2008-08-15 11:44:33

le retard est parce que, ayant été incapable de trouver le DLL serializer personnalisé, le système construit le code équivalent (qui est très longue) à la volée.

le moyen d'éviter le retard est d'avoir le système construire la DLL, et s'assurer qu'il est disponible pour le .EXE - as-tu essayé ça?

4
répondu Will Dean 2008-08-15 11:06:41

d'Accord, alors je n'ai rencontré ce problème et trouvé une solution spécifique à ma région.

cela s'est produit parce que j'essayais de sérialiser une liste dans un document XML (fichier) sans attribut racine XML. Une fois, j'ai ajouté les fichiers suivants, l'erreur disparaît.

XmlRootAttribute rootAttribute = new XmlRootAttribute();
rootAttribute.ElementName = "SomeRootName";
rootAttribute.IsNullable = true;

Je ne sais pas si ça va régler ton problème, mais ça a réglé le mien.

4
répondu Nick Craver 2011-03-30 11:36:50