2010-03-22 9 views
6

मैं सी # में .NET 3.5 कंसोल एप्लिकेशन पर काम कर रहा हूं जो वीसी ++ अप्रबंधित डीएलएल का उपयोग करता है। जब मैंने कुछ हफ्ते पहले इस पर काम किया तो यह बिना किसी समस्या के भाग गया, लेकिन मैं आज वापस आ रहा हूं और अब मुझे BadImageFormatException ("एक गलत प्रारूप के साथ एक प्रोग्राम लोड करने के लिए एक प्रयास किया गया था। (HRESULT से अपवाद: 0x8007000B)).NET असेंबली में BadImageFormatException का वैकल्पिक कारण?

मेरा विकास वर्कस्टेशन 64 बिट विंडोज 7 चला रहा है, और मैं अप्रबंधित कोड के साथ एक उचित मात्रा में काम करता हूं, इसलिए मैंने तुरंत जांच की कि .NET असेंबली और वीसी ++ लाइब्रेरी में दोनों x86 लक्ष्य थे। उन्होंने किया।

बस सुनिश्चित करने के लिए, मैं साफ किया और कोई लाभ नहीं हुआ कुलपति ++ पुस्तकालय और .NET विधानसभा, पुनर्निर्माण किया।

न तो प्रणाली कुछ भी विशेष रूप से असामान्य कर रही है। कुलपति ++ पुस्तकालय भार एक द्विआधारी Dat एक फाइल और इसकी सामग्री पर कुछ गणितीय प्रसंस्करण करता है। .NET असेंबली में पुस्तकालय के लिए DllImports और कुछ कोड इसे तार करने के लिए है। यह सब कुछ हफ्ते पहले काम किया।

तो अब मैं सोच रहा हूं कि BadImageFormatException का कोई अन्य कारण है जो कि x86/x64 संघर्ष से कम आम है जो मैं चल रहा हूं।

धन्यवाद।

संपादित करें: मुझे x86 या x64 मोड के बावजूद एक ही त्रुटि मिलती है, लेकिन जब 'कोई भी CPU' पर सेट किया जाता है, तो निष्पादन उस बिंदु से पहले हो जाता है, लेकिन निष्पादन VC++ लाइब्रेरी में किसी भी अपवाद के बाद बाद में कॉल पर रोक लगाता है। भले ही यह इस समस्या से संबंधित है, क्या ऐसा कुछ है जो 'कोई भी CPU' x86 और x64 दोनों से अलग करता है जो इस पर कुछ प्रकाश डाल सकता है?

+0

क्या कोई मौका है कि चल रहे एप्लिकेशन को वीसी ++ लाइब्रेरी के x64 संस्करण तक पहुंच है और यह इसके बजाय इसे लोड करने का प्रयास कर रहा है? या, आपका चल रहा एप्लिकेशन किसी भीCPU को लक्षित कर सकता है और x86 नहीं? यदि आप 64-बिट वातावरण पर हैं तो AnyCPU 64-बिट में लोड किया जाएगा। – Anzurio

+0

अच्छे प्रश्न। पूर्व इस मामले में प्रतीत नहीं होता है, मैंने परियोजना को दूसरी मशीन पर कॉपी करने की कोशिश की, जिस पर कभी भी लाइब्रेरी की कोई प्रति नहीं थी, केवल असेंबली के x86 संस्करण की प्रतिलिपि बनाने के लिए सावधान रहना। दूसरी मशीन पर भी यही समस्या आई। एप्लिकेशन निश्चित रूप से x86 पर सेट है। जिज्ञासा से मैंने इसे 'किसी भी सीपीयू' में चलाने के लिए सेट किया। जब मैं ऐसा करता हूं, तो यह वीसी ++ लाइब्रेरी (जहां यह x86 या x64 पर सेट होने पर मर जाता है) पर पहली बार कॉल हो जाता है लेकिन लाइब्रेरी में बाद के कॉल के दौरान निष्पादन समाप्त हो जाता है। –

+0

अपने .exe पर और फिर अपने .dll पर निर्भर निर्भरता वॉकर x86 चलाएं। 64 बिट मशीन पर system32 से msvcr120.dll की प्रतिलिपि बनाने के बाद मुझे यह समस्या थी। ओए! –

उत्तर

3

आप सीएलआर 2.0 पर सीएलआर 4.0 के लिए बनाई गई असेंबली लोड करने का प्रयास कर रहे हैं।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, लेकिन हमारे पास कोई विजुअल स्टूडियो 2010 इंस्टॉलेशन नहीं है, इसलिए कोई सीएलआर 4.0 नहीं है। –

2

यहां देशी कोड के उपयोग को देखते हुए मुझे लगता है कि यहां सबसे संभावित समस्या यह है कि आप मूल डीएलएल लोड करने का प्रयास कर रहे हैं जैसे कि यह नेट नेट असेंबली था। यह एक परिदृश्य है जो BadImageFormatException को जन्म देगा।

अपना आवेदन चलाने का प्रयास करें और BadImageFormatException के लिए इसे फेंकने के लिए सेट करें और देखें कि डीएलएल क्या लोड हो रहा है। यदि यह मूल है तो यह समस्या है।

4

जब मुझे यह त्रुटि मिलती है तो यह 64 बिट प्रक्रिया में 32 बिट डीएलएल लोड करके हमेशा होता है।

EX86 फ़ाइल को x86 में संकलित करने के लिए सेट करें और देखें कि यह काम करता है या नहीं।

+0

जैसा कि मैंने प्रारंभिक प्रश्न में कहा था, सबकुछ x86 पर सेट है। –

+0

इससे मुझे बहुत मदद मिली, बहुत बहुत धन्यवाद। – ChaosPandion

+0

मुझे घंटे बचाया + – Xaqron

3

एक .dll लोड संघर्ष की जांच करें!

मैं सी #+/सीएलआई डीएल को सी # से कॉल कर रहा था; सी ++/सीएलआई लाइब्रेरी एक तीसरे पक्ष के देशी डीएल के आसपास एक रैपर है।

बाहर निकलता है मेरे पास पथ (libeay32.dll) दोनों में एक ही नाम के साथ दो डीएलएस थे। करने के लिए: (फ़ोल्डर में "\ Program Files \ डिबगिंग उपकरण सी।।।") http://www.microsoft.com/whdc/devtools/debugging/default.mspx

भागो 'gflags':

आदेश समस्या के स्रोत की खोज करने में मैं खिड़कियों डिबगिंग टूल स्थापित लोडर "स्नैप" के प्रदर्शन को सक्षम करें

यानी

> gflags -i <my test app.exe> +sls 

तो CDB (कंसोल डिबगर) या windbg में अनुप्रयोग चलाने और उत्पादन के माध्यम से ट्राउल पता लगाने के लिए जो dll अपवाद का कारण बना।

उदा।

> cdb -g <my test app.exe> 

'गलत' libeay32.dll का नाम बदलने से समस्या का पता चला लेकिन केवल एक अस्थायी समाधान है!

वही गलती-खोज दृष्टिकोण आपके लिए भी काम कर सकता है।

0

मेरे मामले में, EXE के प्रोजेक्ट गुणों के डीबग टैब में Enable unmanaged code debugging को बंद करना विडंबनात्मक रूप से चाल है, अगर यह चेक किया गया है।

ईमानदार होने के लिए, मुझे यकीन नहीं है कि समस्या का कारण क्यों है।

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