2010-09-17 13 views
9

मैंने विजुअल सी # 2008 (फ्रेमवर्क 3.5) से 2010 (फ्रेमवर्क 4.0) से सी # WinForms एप्लिकेशन को अपग्रेड किया है और मुझे रनटाइम त्रुटियां मिल रही हैं।असेंबली संसाधन VN 2010 ढांचे के लिए अपग्रेड किए गए प्रोजेक्ट में FileNotFoundException 4.0

एप्लिकेशन विधानसभा.लोड (फ़ाइल नाम) का उपयोग कर रनटाइम पर गतिशील रूप से असेंबली लोड करता है। यह इस तरह से डिज़ाइन किया गया है क्योंकि उपयोगकर्ता कॉन्फ़िगरेशन के आधार पर इसे विभिन्न फ़ोल्डरों में स्थित असेंबली के विभिन्न कार्यान्वयन को लोड करना चाहिए।

सब कुछ ठीक काम करता है, को छोड़कर जब भरी हुई dll एम्बेड किए गए संसाधन (बिटमैप या XSD-डेटासेट) मिल गया है तो मैं मिल FileNotFoundException:

{ "फ़ाइल 'FF.Fi_Stat.SKA.resources' नहीं मिल सका।" : शून्य}

असेंबली को FF.Fi_Stat.SKA.dll कहा जाता है। मुझे यह संदेश समझ में नहीं आता है क्योंकि कोई बाहरी संसाधन नहीं है (केवल एम्बेडेड वाले हैं) और आउटपुट निर्देशिका में वीएस द्वारा उस नाम के साथ कोई फ़ाइल उत्पन्न नहीं होती है। कोई विचार?

-

अधिक विवरण:

यह कैसे मैं विधानसभा लोड है:

Assembly a = Assembly.LoadFile(assemblyFileName); 

विधानसभा की वास्तविक लोड हो रहा है काम करता है, यह तब होता है जब मैं का एक उदाहरण बनाने की कोशिश असेंबली के अंदर एक वर्ग जो अपवाद होता है:

Type t = a.GetType("nameofclass"); 
Activator.CreateInstance(t); //fails here 

यहां है स्टैक ट्रेस: ​​

Exception has been thrown by the target of an invocation. 
    at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) 
    at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Activator.CreateInstance(Type type) 
    ... 

भीतरी अपवाद स्टैक ट्रेस: ​​

at System.Reflection.RuntimeAssembly.InternalGetSatelliteAssembly(String name, CultureInfo culture, Version version, Boolean throwOnFileNotFound, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GetSatelliteAssembly(CultureInfo lookForCulture, StackCrawlMark& stackMark) 
    at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 
    at System.Resources.ResourceManager.GetString(String name, CultureInfo culture) 
    at System.Resources.ResourceManager.GetString(String name) 
    at FF.Fi_Stat.SKA.RegForm.InitializeComponent() 
    at FF.Fi_Stat.SKA.RegForm..ctor() 

अब मुझे पता है कि dll का जो काम नहीं करते InitializeComponent में इस लाइन आम में है:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RegForm)); 

हालांकि जैसा कि मैंने बताया कि फ्रेमवर्क 3.5 के साथ कोई समस्या नहीं थी।

-

समाधान

मुझे पता चला है कि समस्या कैसे डॉटनैट ढांचा स्थानीय संसाधन प्राप्त करने की कोशिश की से संबंधित था और मैं अपनी विधानसभाओं में AssemblyInfo.cs में निम्न पंक्ति जोड़ा यह फिर से काम करना शुरू कर दिया।

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)] 
+0

समस्या के अपने दस्तावेज़ को बेहतर बनाएं। कम से कम एक कोड स्निपेट और अपवाद का ढेर निशान। –

+0

मैंने अब और विवरण जोड़े हैं, कृपया एक और नज़र डालें। –

+1

समाधान मिला, उपरोक्त नोट्स जोड़ा गया। –

उत्तर

7

समाधान

मुझे पता चला है कि समस्या कैसे डॉटनैट ढांचा स्थानीय संसाधन प्राप्त करने की कोशिश की से संबंधित था पाया और इसे फिर से काम करना शुरू करने के बाद मैं अपने विधानसभाओं में AssemblyInfo.cs में निम्न पंक्ति गयी।

[assembly: NeutralResourcesLanguageAttribute("sv-SE", UltimateResourceFallbackLocation.MainAssembly)] 
1

आप enabling logging in the the Fusion loader को आजमा सकते हैं। मुझे DWORD मूल्य EnableLogHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion से 1 में बड़ी सफलता मिली है। फिर आपको ईवेंट लॉग में विस्तृत लोडिंग त्रुटि संदेश मिलेंगे।

+0

धन्यवाद, मैंने अभी कोशिश की लेकिन मुझे यकीन नहीं है कि जानकारी का उपयोग कैसे करें। मैं देख सकता हूं कि यह मेरे गतिशील रूप से लोड किए गए डीएल की .resources-file को लोड करने का प्रयास करता है और इसे नहीं ढूंढता है, लेकिन यह कोई संकेत नहीं देता है कि इसे इस मामले में घातक त्रुटि क्यों माना जाता है, क्योंकि मैं यह भी देख सकता हूं कि यह गैर लोड करने का प्रयास करता है इसके बारे में अपवाद उठाए बिना मेरी स्थिर रूप से जुड़ी असेंबली की मौजूदा। स्रोत स्रोत। –

+1

Fuslogvw.exe उपकरण यहां बेहतर mousetrap है, रजिस्ट्री हैक करने की कोई ज़रूरत नहीं है। –

संबंधित मुद्दे