समस्या निवारण BadImageFormatException


107

मेरे पास विजुअल स्टूडियो 2010 का उपयोग करके C # में लिखी गई एक Windows सेवा है और पूर्ण .NET फ्रेमवर्क को लक्षित करना है। जब मैं डीबग से चलता हूं तो यह सेवा अपेक्षित रूप से चलती है। हालाँकि, जब मैं इसे रिलीज़ बिल्ड से चलाता हूं तो मुझे एक System.BadImageFormatException (नीचे विवरण) मिलता है। मैं एक समाधान के लिए इंटरनेट पर खोज कर रहा हूं, लेकिन अभी तक मैंने जो कुछ भी पाया है, उससे मुझे समाधान खोजने में मदद नहीं मिली है।

Windows 7 64-बिट (dev) और Windows XP SP3 32-बिट (लक्ष्य) सिस्टम पर समस्या मौजूद है।

यहाँ मैंने अभी तक कोशिश की है:

  • प्लेटफ़ॉर्म लक्ष्य जैसी सत्यापित बिल्ड सेटिंग्स सभी समान हैं (x86)।
  • असेंबली बायनेरिज़ मान्य थे, यह सुनिश्चित करने के लिए / क्रिया विकल्प के साथ प्रयोग करें।
  • किसी भी लोडिंग मुद्दे को देखने के लिए fuslogvw का उपयोग करता है।
  • गुम फाइलों या असेंबलियों को देखने के लिए CheckAsm का उपयोग किया।

इन सभी जाँचों से कुछ भी नहीं बदला। मैंने नीचे दी गई अपवाद जानकारी का पूरा पाठ शामिल किया है, जिसमें कुछ नाम मेरे कॉर्पोरेट स्वामी के रहस्यों की रक्षा के लिए बदले गए हैं।

System.BadImageFormatException अनहेल्दी था
  संदेश = फ़ाइल या असेंबली 'XxxDevices, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null' या उसकी किसी एक निर्भरता को लोड नहीं किया जा सका। एक प्रोग्राम को एक गलत प्रारूप के साथ लोड करने का प्रयास किया गया था।
  स्रोत = XxxDevicesService
  FileName = XxxDevices, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null
  FusionLog = असेंबली प्रबंधक से लोड किया गया: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll
निष्पादन योग्य c: \ Dev \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe के तहत चल रहा है
--- एक विस्तृत त्रुटि लॉग निम्नानुसार है। 

=== राज्य की पूर्व सूचना बाँध ===
लॉग: उपयोगकर्ता = XXX
लॉग: DisplayName = XxxDevices, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null
 (पूरी तरह से निर्दिष्ट)
लॉग: Appbase = फ़ाइल: /// c: / देव / टीम / बिन / रिलीज़ /
लॉग: प्रारंभिक PrivatePath = NULL
कॉलिंग असेंबली: XxxDevicesService, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null।
===
लॉग: यह बाइंड डिफ़ॉल्ट लोड संदर्भ में शुरू होता है।
लॉग: एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल का उपयोग करना: c: \ TeamE \ bin \ रिलीज़ \ XxxDevicesService.vshost.exe.Chfig
लॉग: होस्ट कॉन्फ़िगरेशन फ़ाइल का उपयोग करना: 
लॉग: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config से मशीन कॉन्फ़िगरेशन फ़ाइल का उपयोग करना।
लॉग: इस समय (निजी, कस्टम, आंशिक, या स्थान-आधारित असेंबली बाइंड) संदर्भ के लिए लागू नहीं की जा रही नीति।
लॉग: नई URL फ़ाइल का डाउनलोड करने का प्रयास: /// c: /TeamE/bin/Release/XxxDevices.DLL।
ERR: असेंबली का पूरा सेटअप विफल (hr = 0x8007000b)। जांच समाप्त हो गई।

  स्टैक ट्रेस:
       XxxDevicesService.Program.Main (स्ट्रिंग [] args) पर
       System.AppDomain._nExecuteAssembly (RuntimeAssembly विधानसभा, स्ट्रिंग [] args)
       Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () पर
       System.Threading.ExecutionContext.Run (ExecutionContext एक्ज़ीक्यूशन कॉन्टेक्स्ट, कॉन्टेक्स्ट कॉलबैक कॉलबैक, ऑब्जेक्ट स्टेट, बूलियन इग्नू सिंकटैक्स)
       System.Threading.ExecutionContext.Run (ExecutionContext एक्जिक्यूटिव कॉन्टेक्स्ट, कॉन्टेक्स्ट कॉलबैक कॉलबैक, ऑब्जेक्ट स्टेट)
       System.Threading.ThreadHelper.ThreadStart () पर
  InnerException: 
c#  .net  exception 

क्या आप मूल कोड / .net को बिल्कुल मिला रहे हैं?
कीथ निकोलस

1
आप सही ट्रैक पर हैं कि यह अपवाद x86 / x64 बिट अंतर के साथ जुड़ा हुआ है। मुझे लगता है कि यह एक वेब अनुप्रयोग सही नहीं है? साथ ही, किस प्रकार की विधानसभा है XxxDevicesService? क्या यह एक विशिष्ट मंच (जैसे 32 बिट) के लिए संकलित है? यदि हां, तो आपको अपने प्लेटफॉर्म को 32 बिट पर संकलित करना होगा।
Reddog

जवाबों:


121

प्लेटफ़ॉर्म लक्ष्य जैसी सत्यापित बिल्ड सेटिंग्स सभी समान हैं (x86)।

क्रैश लॉग कहता है कि नहीं:

असेंबली मैनेजर से लोड किया गया: C: \ Windows \ Microsoft.NET \ Framework64

64 नाम पर ध्यान दें , यह फ्रेमवर्क के 64-बिट संस्करण का घर है। अपने EXE प्रोजेक्ट पर लक्ष्य प्लेटफ़ॉर्म सेटिंग सेट करें , न कि आपकी क्लास लाइब्रेरी प्रोजेक्ट। XxxDevicesService EXE प्रोजेक्ट प्रक्रिया की बिटनेस निर्धारित करता है।


6
और जब आप EXE प्रोजेक्ट की जाँच कर रहे हों- डिबग और रिलीज़ दोनों की जाँच करें । : /
क्रिस 13

44

जब मैंने पूरे सप्ताह के बारे में सोचकर डेस्क पर अपना सिर पीटना बंद कर दिया, तब मैंने इस समस्या को हल करने में बिताया, जो मेरे लिए काम कर रहा है, मैं उसे साझा कर रहा हूं। मेरे पास Win7 64 बिट, 32-बिट ओरेकल क्लाइंट है, और मेरे MVC 5 प्रोजेक्ट को ओरेकलनेस के कारण x86 प्लेटफॉर्म पर चलाने के लिए सेट किया गया है। मुझे वही त्रुटियां मिलती रहीं:

फ़ाइल या असेंबली 'Oracle.DataAccess' या उसकी किसी एक निर्भरता को लोड नहीं किया जा सका। एक प्रोग्राम को एक गलत प्रारूप के साथ लोड करने का प्रयास किया गया था।

मैंने NuGet संकुल को पुनः लोड किया, मैंने अलग-अलग ऐप में दूसरों के लिए काम करने वाले DLL की प्रतियों का उपयोग किया, मैंने अपनी परियोजना के बिन फ़ोल्डर की ओर इशारा करने के लिए असेम्बली असेंबली में कोडबेस सेट किया, मैंने CopyLocal को सही या गलत के रूप में आज़माया, मैंने सब कुछ देखा। अंत में मेरे पास पर्याप्त कुछ था जो मैं अपने कोड में जांचना चाहता था, और एक नए ठेकेदार के रूप में मेरे पास तोड़फोड़ नहीं थी। वीएस में इसे हुक करने का एक तरीका खोजते हुए, मैंने उत्तर पर कोशिश की। मैंने जो काम किया, वह प्रोजेक्ट्स और सॉल्यूशंस => टूल्स प्रोजेक्ट्स> विकल्प मेनू के तहत "वेब साइट्स और प्रोजेक्ट्स के लिए IIS एक्सप्रेस के 64 बिट संस्करण का उपयोग करें" विकल्प अनचेक कर रहा था।


3
क्या एक जीवन रक्षक !! धन्यवाद। मेरे लिए मुझे वास्तव में यह जांचना था, क्योंकि मेरी परियोजना प्रभावी रूप से x64 है। एक बार फिर धन्यवाद!!!
वाइपर

मुझे यहाँ मिली सभी मदद के बाद, मुझे बहुत खुशी हुई कि मैं इसमें से कुछ का भुगतान करने में सक्षम हूँ!
जोसेफ मॉर्गन 23

3
स्थानीय IIS का उपयोग करने वालों के लिए, सुनिश्चित करें कि आपका ऐप पूल का "सक्षम 32-बिट एप्लिकेशन" (उन्नत सेटिंग्स के तहत) ट्रू पर सेट है ।
एरिक एस्किल्डसन

एप्लिकेशन पूल में "32-बिट एप्लिकेशन सक्षम करें" के बारे में उपरोक्त एरिकसेल्ड्सन की टिप्पणी का एक परिशिष्ट, भले ही आप लाइव वातावरण में ऐसा नहीं करना चाहते हों, उस स्विच को फ़्लिप करना अतिरिक्त सुराग प्रदान कर सकता है जैसे कि आप 32 का सामना कर रहे हैं -बिट / 64-बिट समस्या या कुछ और।
बजे एक CVn

बूम! वह यह था।
itslittlejohn

21

मैंने जो काम किया, वह प्रोजेक्ट्स और सॉल्यूशंस => टूल्स प्रोजेक्ट्स> विकल्प मेनू के तहत "वेब साइट्स और प्रोजेक्ट्स के लिए IIS एक्सप्रेस के 64 बिट संस्करण का उपयोग करें" विकल्प की जाँच कर रहा था।


आप रक्षक हैं। +1
अमित कुमार

मैंने वीएस को फिर से स्थापित किया और इस समस्या का निवारण किया (धन्यवाद - यह समाधान काम किया)। मेरे लिए कहानी का नैतिक है अगर मुझे पता है कि मैंने शुरू करने के लिए कोई कोड नहीं बदला है, तो शायद मुझे वीएस के कॉन्फ़िगरेशन को देखना चाहिए।
taylorswiftfan

@Lucy चेक बॉक्स 'वेब साइटों और परियोजनाओं के लिए IIS एक्सप्रेस के 64 बिट संस्करण का उपयोग करें' वांछनीय है
k_kumar

कृपया लूसी को बताएं
k_kumar

12

यह आमतौर पर तब हो सकता है जब आपने .csproj के लक्ष्य ढांचे को बदल दिया था और इसे वापस वही किया जो आपने शुरू किया था।

App.config में स्टार्टअप टैग के तहत सुनिश्चित करें कि यदि 1 समर्थित है तो संस्करण रनटाइम संस्करण = "सीएस प्रोजेक्ट लक्ष्य से एक अलग रनटाइम"।

सुनिश्चित करें कि 2 का अर्थ यह भी है कि अन्य ऑटोजेनरेटेड या अन्य फ़ाइलों की जाँच करने के लिए गुण फ़ोल्डर हो सकता है यह देखने के लिए कि क्या इन फ़ाइलों के बीच कोई रनटाइम बेमेल नहीं है और जो .csproj फ़ाइल में परिभाषित है।

त्रुटि को दूर करने के लिए प्रोजेक्ट गुणों के साथ विभिन्न चीजों को आज़माने से पहले ये आपको बहुत समय बचा सकते हैं।


मैं एक ऐसी ही समस्या के बारे में आया और आपका जवाब मेरे लिए समाधान था। मेरे app.config में अलग-अलग समर्थित रनटाइम था।
क्रिस्ज़िआन किस सेप

9

मुझे 64-बिट विंडोज 7 होने के बावजूद भी यही समस्या थी और मैं प्रोजेक्ट प्रॉपर्टीज में 64 बिट डीएलएल बी / सी लोड कर रहा था। बिल्ड I में "32-बिट को प्राथमिकता दें" चेक किया गया था। (पता नहीं क्यों डिफ़ॉल्ट रूप से सेट किया गया है)। एक बार जब मैं अनियंत्रित हुआ, तो सब कुछ ठीक चला


1
मुझे भी। यह चाल चली। 64-बिट असेंबली का संदर्भ दिया और सक्रिय बिल्ड कॉन्फ़िगरेशन किसी भी CPU पर सेट किया गया था, लेकिन इस वजह से "32-बिट पसंद करें" सेटिंग निश्चित रूप से 32-बिट का उपयोग एप्लिकेशन को चलाने में किया गया था और परेशानियों का कारण बना।
बर्नौली आईटी

डिबग मोड में x86 के बजाय किसी भी सीपीयू को चुना और एक आकर्षण की तरह काम किया।
कार्डि डेमोनको जूनियर

7

आपको यह अपवाद तब भी मिल सकता है जब आपका एप्लिकेशन लक्ष्य .NET फ्रेमवर्क 4.5 (उदाहरण के लिए) और आपके पास निम्न app.config है:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

अनुप्रयोग के डिबग को लॉन्च करने का प्रयास करते समय आपको BadImageFormatException मिलेगा।

V2.0 संस्करण की घोषणा करने वाली लाइन को हटाने से त्रुटि स्पष्ट हो जाएगी।

हाल ही में मेरे पास यह मुद्दा था जब मैंने एक पुराने .NET 2.0 प्रोजेक्ट से लक्ष्य प्लेटफ़ॉर्म को .NET 4.5 में बदलने का प्रयास किया था।


6

पृष्ठभूमि

हमें यह तब मिलना शुरू हुआ, जब हमने IIS 2012 में चलने वाले Windows 2012 R2 सर्वर पर AnyCPU से x64 तक अपनी WCF सेवा को स्विच किया।

पहले हमने केवल 10 बार संदर्भित विधानसभा की जाँच की, यह सुनिश्चित करने के लिए कि यह वास्तव में x86 dll नहीं है। आगे हमने 32 बिट अनुप्रयोगों को सक्षम नहीं करने के लिए कई बार एप्लिकेशन पूल की जाँच की।

फुसफुसाहट पर मैंने सेटिंग को टॉगल करने की कोशिश की। यह पता चलता है कि IIS में अनुप्रयोग पूल 32-बिट अनुप्रयोग मान को सक्षम करने में डिफ़ॉल्ट थे , लेकिन IIS इसे किसी कारण से हमारे सर्वर पर अनदेखा कर रहा था और हमेशा x86 मोड में हमारी सेवा चलाता था।

उपाय

  • एप्लिकेशन पूल का चयन करें।
  • चुनें सेट आवेदन पूल चूक ... या उन्नत सेटिंग ...
  • बदलें 32-बिट अनुप्रयोगों को सक्षम सही पर।
  • ओके पर क्लिक करें ।
  • चुनें सेट आवेदन पूल चूक ... या उन्नत सेटिंग ... फिर से।
  • बदलें 32-बिट अनुप्रयोगों को सक्षम गलत पर वापस।
  • ओके पर क्लिक करें ।

4

मैंने एक अलग "एप्लिकेशन पूल" का उपयोग करने के लिए वेब ऐप को बदलकर इस मुद्दे को ठीक किया।


4

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

मैंने अतिरिक्त ऐप कॉन्फिगर को डिलीट कर दिया और यह काम कर गया।


इसे मेरे लिए तय किया। मेरा App.config 2.0 CLR में मेरी .NET 4.5.1 ऐप सेट कर रहा था!
जेरेड थिरस्क

4

लक्ष्य निर्माण x 64 लक्ष्य सर्वर होस्टिंग IIS 64 बिट

यदि एप्लिकेशन बिल्ड 64-बिट ओएस को लक्षित कर रहा है, तो IIS होस्ट करने वाले 64-बिट सर्वर पर, वेबसाइट / वेब एप्लिकेशन को झूठे चलाने वाले ऐप पूल पर 32 बिट एप्लिकेशन को सक्षम करें।

यहां छवि विवरण दर्ज करें


2

एप्लिकेशन द्वारा उपयोग किए गए एप्लिकेशन पूल का निर्धारण करें और 32 बिट अनुप्रयोगों को True पर सक्षम करके संपत्ति सेट करें। यह एप्लिकेशन पूल की अग्रिम सेटिंग्स के माध्यम से किया जा सकता है।


2

32-बिट या 64-बिट प्लेटफ़ॉर्म के लिए एप्लिकेशन बनाते समय (मेरा अनुभव विज़ुअल स्टूडियो 2010 के साथ है), निष्पादन योग्य के लिए सही प्लेटफ़ॉर्म सेट करने के लिए कॉन्फ़िगरेशन प्रबंधक पर भरोसा न करें। भले ही सीएम ने आवेदन के लिए x86 का चयन किया हो, प्रोजेक्ट गुण (बिल्ड टैब) की जांच करें: यह अभी भी "कोई भी सीपीयू" कह सकता है। और यदि आप 64-बिट प्लेटफॉर्म पर "कोई भी CPU" निष्पादित करते हैं, तो यह 64-बिट मोड में चलेगा और x86 प्लेटफॉर्म के लिए बनाए गए अपने साथ के DLL को लोड करने से मना कर देगा।


1

अपने Web.Config में System.Runtime पर अपनी निर्भरता निकालें, यह मेरे लिए काम किया:

<dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
</dependentAssembly>

मेरे लिए यह था System.Net.Http। इसके लिए धन्यवाद्।
स्नेकक्रैक

1

के लिए नेट कोर , वहाँ एक है दृश्य स्टूडियो 2017 बग है कि परियोजना के गुण बिल्ड पेज गलत मंच लक्ष्य को दिखाने के लिए हो सकता है। एक बार जब आपको पता चलता है कि समस्या है, तो वर्कअराउंड बहुत आसान है। आप लक्ष्य को कुछ अन्य मूल्य में बदल सकते हैं और फिर इसे वापस बदल सकते हैं।

वैकल्पिक रूप से, आप .csproj में एक रनटाइम पहचानकर्ता जोड़ सकते हैं। यदि आपको x86 के रूप में चलाने के लिए अपने .exe की आवश्यकता है ताकि यह x86 देशी DLL को लोड कर सके, तो इस तत्व को एक में जोड़ें PropertyGroup:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

इसे लगाने के लिए एक अच्छी जगह TargetFrameworkया TargetFrameworksतत्व के ठीक बाद है ।


1

मुझे आश्चर्य है कि किसी और ने इसका उल्लेख नहीं किया है इसलिए मैं उपरोक्त सहायता (मेरा मामला) के मामले में साझा नहीं कर रहा हूं।

क्या हो रहा था कि एक VBCSCompiler.exe उदाहरण किसी तरह फंस गया था और वास्तव में नई फ़ाइलों को सही ढंग से लिखने के लिए नए इंस्टेंसेस को अनुमति देने के लिए फ़ाइल हैंडल जारी नहीं कर रहा था और समस्या पैदा कर रहा था। यह स्पष्ट हो गया जब मैंने "बिन" फ़ोल्डर को हटाने की कोशिश की और यह शिकायत कर रहा था कि एक अन्य प्रक्रिया वहां फाइलों का उपयोग कर रही थी।

बंद VS, खोला गया कार्य प्रबंधक, देखा और सभी VBCSCompiler इंस्टेंसेस को समाप्त कर दिया और "बिन" फ़ोल्डर को हटा दिया जहां मैं था।

संदर्भ: https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html


मेरा समाधान सभी बिन और डिबग निर्देशिका को हटाने के लिए भी था।
गब्नीम

0

किसी के लिए जो बाद में यहां पहुंच सकता है ...
डेस्कटॉप समाधान के लिए मुझे BadImageFormatExceptionअपवाद मिला ।
सभी प्रोजेक्ट के बिल्ड विकल्प ठीक थे (सभी x86)। लेकिन समाधान का स्टार्टअप प्रोजेक्ट कुछ अन्य प्रोजेक्ट (क्लास लाइब्रेरी प्रोजेक्ट) में बदल दिया गया।

मूल (.exe अनुप्रयोग प्रोजेक्ट) के लिए स्टार्टअप प्रोजेक्ट को बदलना मेरे मामले में एक समाधान था


0

जब मैंने इस मुद्दे का सामना किया तो निम्नलिखित ने इसे मेरे लिए हल किया:

मैं एक और exe के अंदर से OpenCV dll को कॉल कर रहा था, मेरे dll में पहले से ही आवश्यक opencv dlls जैसे highgui, features2d, और etc मेरे exe फ़ाइल के फ़ोल्डर में उपलब्ध नहीं थे। मैंने इन सभी को अपनी exe परियोजना की निर्देशिका में कॉपी किया और यह अचानक काम आया।


0

यह त्रुटि "फ़ाइल या असेंबली का उदाहरण 'या उसकी किसी एक निर्भरता को लोड नहीं कर सकती है। एक प्रोग्राम को एक गलत प्रारूप के साथ लोड करने का प्रयास किया गया था" आमतौर पर एक गलत एप्लीकेशन पूल कॉन्फ़िगरेशन के कारण होता है।

  1. सुनिश्चित करें कि वर्तमान में आपकी साइट जिस AppPool पर चल रही है, वह "32-बिट एप्लिकेशन सक्षम करें" गलत पर सेट है।
  2. सुनिश्चित करें कि आप अपने मंच के लिए सही संस्करण का उपयोग कर रहे हैं।
  3. यदि आपको किसी वेब साइट पर यह त्रुटि हो रही है, तो सुनिश्चित करें कि आपका एप्लिकेशन पूल सही मोड में चलने के लिए सेट है (3.0 साइट 64% मोड में चलना चाहिए)
  4. आपको यह भी सुनिश्चित करना चाहिए कि विज़ुअल स्टूडियो में उस असेंबली का संदर्भ पैकेज फ़ोल्डर में सही फ़ाइल पर इंगित कर रहा है।
  5. सुनिश्चित करें कि आपके पास 2.0 साइटों के लिए GAC में स्थापित dll का सही संस्करण है।
  6. यह WSODLibs द्वारा वेब प्रोजेक्ट के साथ प्रचारित किए जाने के कारण भी हो सकता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.