2010-08-16 22 views
28

जब किसी एप्लिकेशन को डिबग करना होता है तो मुझे विजुअल स्टूडियो में अपवाद पर ब्रेक होने पर हमेशा निम्न त्रुटि मिलती है। यह वास्तव में मुझे परेशान कर रहा है, क्योंकि हम अपवाद पर ब्रेक के साथ काम करते हैं। मजाकिया बात यह है कि जब भी मैं जारी रहता हूं तब भी यह काम करता है (स्ट्रिंगकोलेक्शन लोड होता है)। 'संस्करण = 4.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089 System.XmlSerializers,' या अपनी निर्भरता में से एकFileNotFoundException अनुप्रयोग सेटिंग्स सेटिंग्स में

फ़ाइल या विधानसभा लोड नहीं कर सका:

संदेश है। सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा। (डिजाइनर उत्पन्न)

यहाँ कोड है कि अपवाद उत्पन्न कर रहा है है

[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; 
     } 
    } 

मैं एक खाली परीक्षण अनुप्रयोग है कि त्रुटि दिखाता है बनाने की कोशिश की, लेकिन अपवाद नहीं होती है। हमारी परियोजना बहुत बड़ी है इसलिए कारण ढूंढना मुश्किल है। हो सकता है कि इस साइट पर किसी को यह पता चल जाए कि इसे कैसे हल किया जाए।

उत्तर

51

इस अपवाद को क्यों फेंक दिया गया है इसके लिए सिर्फ एक स्पष्टीकरण। आप इस नमूना विंडोज फॉर्म ऐप के साथ अपवाद दोहरा सकते हैं। स्ट्रिंगकोलेक्शन प्रकार के "सेटिंग" नामक एक सेटिंग जोड़कर प्रारंभ करें। वैल्यू कॉलम में डॉट्स पर क्लिक करें और कुछ स्ट्रिंग्स दर्ज करें। प्रपत्र वर्ग कोड बनाओ इस तरह दिखेगा:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    protected override void OnFormClosing(FormClosingEventArgs e) { 
     Properties.Settings.Default.Setting[0] = DateTime.Now.ToString(); 
     Properties.Settings.Default.Save(); 
     base.OnFormClosing(e); 
    } 
} 

डीबग + अपवाद, CLR अपवाद के लिए फेंक दिया चेकबॉक्स टिक करें। फॉर्म चलाएं और इसे बंद करें, अपवाद फेंकने पर डीबगर बंद हो जाएगा। कॉल स्टैक के शीर्ष इस तरह दिखता है:

mscorlib.dll!System.Reflection.Assembly.nLoad(System.Reflection.AssemblyName fileName, string codeBase, System.Security.Policy.Evidence assemblySecurity, System.Reflection.Assembly locationHint, ref System.Threading.StackCrawlMark stackMark, bool throwOnFileNotFound, bool forIntrospection) + 0x2c bytes 
mscorlib.dll!System.Reflection.Assembly.InternalLoad(System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity, ref System.Threading.StackCrawlMark stackMark, bool forIntrospection) + 0x80 bytes 
mscorlib.dll!System.Reflection.Assembly.Load(System.Reflection.AssemblyName assemblyRef) + 0x1d bytes 
System.Xml.dll!System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(System.Type type = {Name = "StringCollection" FullName = "System.Collections.Specialized.StringCollection"}, string defaultNamespace = null, out System.Xml.Serialization.XmlSerializerImplementation contract = null) + 0xcd bytes 
System.Xml.dll!System.Xml.Serialization.XmlSerializer.XmlSerializer(System.Type type = {Name = "StringCollection" FullName = "System.Collections.Specialized.StringCollection"}, string defaultNamespace = null) + 0x105 bytes 

आप एक विधानसभा कि StringCollection वर्ग के लिए एक्सएमएल serializer शामिल XmlSerializer वर्ग शिकार देख सकते हैं। LoadGeneratedAssembly विधि हटाया उबाऊ बिट्स के साथ इस तरह दिखता है:

internal static Assembly LoadGeneratedAssembly(Type type, string defaultNamespace, out XmlSerializerImplementation contract) 
{ 
    ... 
    AssemblyName parent = GetName(type.Assembly, true); 
    partialName = Compiler.GetTempAssemblyName(parent, defaultNamespace); 
    parent.Name = partialName; 
    parent.CodeBase = null; 
    parent.CultureInfo = CultureInfo.InvariantCulture; 
    try 
    { 
     serializer = Assembly.Load(parent);  // <=== here 
    } 
    catch (Exception exception) 
    { 
     ... 
    } 
    .... 
} 

और Compiler.GetTempAssemblyName():

internal static string GetTempAssemblyName(AssemblyName parent, string ns) 
{ 
    return (parent.Name + ".XmlSerializers" + (((ns == null) || (ns.Length == 0)) ? "" : ("." + ns.GetHashCode()))); 
} 

यह GetTempAssemblyName इस मामले में बुराई कर्ता है। स्ट्रिंगकोलेक्शन क्लास System.dll असेंबली में रहता है, विधि "System.XmlSerializers" नाम उत्पन्न करती है। यह विधि आपके स्वयं के वर्गों के लिए असेंबली खोजने के लिए डिज़ाइन की गई है, जो Sgen.exe द्वारा जेनरेट की गई है। अपने नमूना कार्यक्रम के लिए WindowsApplication1.XmlSerializers.dll की तरह। लेकिन स्ट्रिंगकोलेक्शन .NET Framework में एक वर्ग है, जो असेंबली नाम उत्पन्न करता है वह मान्य नहीं है। वास्तव में एक "System.XmlSerializers नहीं है।डीएलएल "ढांचे में असेंबली।

कनेक्ट.microsoft.com पर इस व्यवहार के बारे में फीडबैक रिपोर्ट सभी को" डिजाइन द्वारा "बंद कर दिया गया है। यह था, मूल डिजाइनरों ने अपवाद को रोकने की लागत को बहुत अधिक माना और फैसला किया बस अपवाद पकड़ो। कौन सा सब ठीक काम करता है, अपवाद वास्तव में पकड़ा जाता है। आप इसे देखने के लिए होते हैं क्योंकि आपको डीबग + अपवाद संवाद में फेंक दिया गया चेकबॉक्स चालू हो गया है।

एक्सएमएल सीरियलाइजेशन कोड को अलग तरीके से व्यवहार करना यहां है एक विकल्प नहीं। System.dll असेंबली में प्रकारों को आसानी से फ़िल्टर करना उनके लिए आसान होता, लेकिन यह संभावित रूप से कभी खत्म होने वाली लड़ाई नहीं है, ढांचे में बहुत अधिक असेंबली हैं। एक कामकाज स्वयं का उपयोग करना है इसके बजाय सेटिंग स्टोर करने के लिए कक्षा एक स्ट्रिंगकोलेक्शन का उपयोग करने के लिए।

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद। मैं भविष्य में स्ट्रिंगकोलेक्शन का उपयोग करने से बचने की कोशिश करता हूं। बहुत बुरा यह "डिजाइन द्वारा" है। – testalino

+0

वहां आप जाते हैं :) – testalino

+0

शानदार उत्तर फिर से ... – MoonKnight

1

आप बहुत सारे अपवादों को पकड़ रहे हैं, System.XmlSerializer हमेशा इस अपवाद को अपने सामान्य ऑपरेशन के हिस्से के रूप में फेंक देगा, इसे कक्षा द्वारा पकड़ा और संभाला जाता है। अपने अपवादों को केवल पकड़ने के लिए अपने डीबगिंग विकल्पों को बदलें, अपवादों को नहीं हटाया जाता है और .net farmework कक्षाओं में संभाला जाता है। , मैं केवल दो तरीके दिए पेशकश कर सकते हैं:

अक्षम इस विशिष्ट अपवाद: गोटो डीबग/अपवाद जोड़ें क्लिक करें, प्रकार:

+1

ick .... वास्तव में? – kenny

+1

+1, यूप। मेरे पास System.Xml के लिए घृणा की उचित मात्रा है, न कि महान भागों में से एक। –

+0

जैसा कि मैंने कहा, अपवाद एक परीक्षण अनुप्रयोग में एक ही सेटिंग संपत्ति के साथ नहीं होता है। तो यह सच नहीं है कि XmlSerializer हमेशा इस अपवाद को फेंक देगा। – testalino

6

इस के रूप में वास्तव में ( XmlSerializer giving FileNotFoundException at constructor भी देखें) सामान्य ऑपरेशन का हिस्सा प्रतीत हो रहा है सी ++ अपवाद, नाम: EEFileLoadException (यदि यह अपवाद है जिसे आप देख रहे हैं), इस अपवाद के लिए थ्रो हुए चेकबॉक्स को अनचेक करें।

सेटिंग के प्रकार को स्ट्रिंग में बदलें और इसे एक्सेस करें उदा। इस तरह:

var mru = Settings.Default.Mru.Split('|'); 
Settings.Default.Mru = string.Join("|", mru.ToArray()); 
संबंधित मुद्दे