FileNotFoundException dans ApplicationSettingsBase
Lors du débogage d'une application, je reçois toujours le message d'erreur suivant lorsque la pause sur une exception est activée dans Visual Studio. Cela m'énerve vraiment, puisque nous travaillons avec une pause sur une exception. Le plus drôle, c'est que ça fonctionne encore quand je continuer (la StringCollection est chargé).
Le Message est:
Impossible de charger le fichier ou l'assembly 'Système.XmlSerializers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ou une de ses dépendances. Le système ne peut pas trouver le fichier spécifié.
Voici le code qui est à l'origine de l'exception (généré par le concepteur)
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::System.Collections.Specialized.StringCollection Mru {
get {
return ((global::System.Collections.Specialized.StringCollection)(this["Mru"]));
}
set {
this["Mru"] = value;
}
}
J'ai essayé de créer un vide de l'application de test qui montre l'erreur, mais l'exception n'a pas eu lieu. Notre projet est énorme donc c'est dur de trouver la cause. Peut-être que quelqu'un sur ce site a une idée de comment résoudre ce problème.
Vous devez vous connecter pour publier un commentaire.
Juste une explication pour pourquoi cette exception est levée. Vous pouvez reproduire l'exception avec cet exemple d'application Windows Forms. Commencez par ajouter un paramètre nommé "Réglage" de type StringCollection. Cliquez sur les points dans la colonne Valeur et entrez un des deux chaînes. Faire de la classe de la forme de code ressemble à ceci:
Debug + Exceptions, cochez la Levée de case à cocher pour le CLR exceptions. Exécutez le formulaire et de le fermer, le débogueur s'arrête lorsque l'exception est levée. Le haut de la pile d'appel ressemble à ceci:
Vous pouvez voir la classe XmlSerializer de chasse pour un assembly qui contient le sérialiseur XML pour la StringCollection classe. Le LoadGeneratedAssembly méthode ressemble à ceci avec l'ennuyeux supprimée:
Et Le Compilateur.GetTempAssemblyName():
Ce GetTempAssemblyName est le mal-doer dans ce cas. Le StringCollection classe vit dans l'System.dll assemblée, la méthode génère le nom de "Système.XmlSerializers". Cette méthode est conçue pour trouver l'assemblée pour vos propres classes, celui généré par Sgen.exe. Comme WindowsApplication1.XmlSerializers.dll pour votre exemple de programme. Mais StringCollection est une classe de l' .NET Framework, le nom de l'assemblage qu'il génère n'est tout simplement pas valide. Il n'est pas réellement un "System.XmlSerializers.dll" l'assemblée dans le cadre.
Des rapports de rétroaction à propos de ce comportement à connect.microsoft.com ont tous été fermés avec "By Design". Il a été, les concepteurs d'origine considéré comme le coût de la prévention à l'exception trop élevé et a décidé à juste attraper l'exception. Qui tous fonctionne bien, l'exception est en effet pris. Vous venez d'arriver à le voir parce que vous avez obtenu la Levée de case à cocher activée dans le Debug + boîte de dialogue Exceptions.
Faire de la sérialisation Xml code se comportent différemment ici n'est pas une option. Il aurait été assez facile pour eux de simplement filtrer les types de l'System.dll de l'assemblée, mais c'est potentiellement une bataille sans fin, il y a beaucoup plus d'assemblées dans le cadre. Une solution de contournement est d'utiliser votre propre classe pour enregistrer le réglage au lieu d'utiliser un StringCollection.
Comme cela semble vraiment être une partie du fonctionnement normal (voir aussi:
XmlSerializer donnant FileNotFoundException au constructeur), Je peux seulement vous proposons deux solutions:
Désactiver cette exception spécifique: goto Debug/Exceptions, cliquez sur Ajouter, Tapez: les Exceptions C++, Nom: EEFileLoadException (si c'est l'exception que vous voyez), décochez la Levée case de cette exception.
Modifier le type de réglage de la chaîne et de l'accès par exemple comme ceci:
Vous êtes à la capture de trop nombreuses exceptions, le Système.XmlSerializer toujours de se débarrasser de cette exception dans le cadre de son fonctionnement normal, il est interceptée et gérée par la classe elle-même. Modifier vos options de débogage pour seul hic, vos exceptions, pas des exceptions, qui sont détectés et gérés au sein de la .net farmework classes.