"जब प्लेटफ़ॉर्म समान होता है तब भी एक प्रोग्राम को एक गलत प्रारूप के साथ लोड करने का प्रयास किया गया था।"


461

मैं 64-बिट सिस्टम पर 32-बिट अप्रबंधित DLL से फ़ंक्शन कॉल कर रहा हूं। मुझे क्या मिलता है:

BadImageFormatException: एक प्रोग्राम को एक गलत प्रारूप के साथ लोड करने का प्रयास किया गया था। (HRESULT से अपवाद: 0x8007000B)

सबसे पहले, मैंने अपनी परियोजनाओं को किसी भी CPU प्लेटफ़ॉर्म पर सेट किया था, इसलिए मैंने उन दोनों को x86 में बदल दिया, लेकिन यह त्रुटि अभी भी हो रही है। यह वास्तव में एकमात्र फिक्स है जो मैं इसके लिए जानता हूं।

DLL भ्रष्ट या कुछ भी नहीं हैं, क्योंकि मैं उन्हें अन्य कार्यक्रमों के साथ उपयोग कर सकता हूं (कि मेरे पास स्रोत नहीं है)। मैंने सोचा था कि शायद यह निर्भरता नहीं पा रहा था, लेकिन मैंने जाँच की और वे सब वहाँ हैं। इसके अलावा, यह DllNotFoundExceptionउस मामले में फेंक नहीं होगा ?

मैं और क्या कर सकता हुँ? और इससे पहले कि आप कहते हैं "एक 64-बिट अप्रबंधित DLL का उपयोग करें," मुझे बताएं कि कोई नहीं है। ;)


1
आपने x86 में कौन से प्रोजेक्ट बदले? और जब आप डिबगर या मैन्युअल रूप से अपवाद प्राप्त करते हैं, तो आप उन्हें कैसे निष्पादित करते हैं? यदि बाद में, आपने देखा कि जब आप x86 में बदल गए, तो आपको अपने बिन \ डायरेक्टरी में एक नया फ़ोल्डर मिला? यह मूल रूप से अब फ़ाइलों के लिए बिन \ x86 \ डीबग है।
लेज़ वी। कार्लसन

क्या आप यह सत्यापित कर सकते हैं कि निष्पादन योग्य 32-बिट मोड में चल रहा है (* प्रक्रिया प्रबंधक में 32)?
जेपी अलीोटो

@Lasse V. Karlsen: हाँ, मैंने x86 बिट को आउटपुट पथ से हटा दिया जब मैंने प्रत्येक प्रोजेक्ट में प्लेटफ़ॉर्म को बदल दिया। मेरा पहला प्रोजेक्ट एक DLL है जो मानव रहित DLL में फ़ंक्शन को लपेटता है। दूसरी परियोजना एक निष्पादन योग्य है जो पहले DLL में आवरण का उपयोग करता है। दोनों x86 पर सेट हैं।
डेविड ब्राउन

@ जेपी: दरअसल, प्रक्रिया प्रबंधक इसे 32-बिट प्रक्रिया के रूप में चलाने के लिए नहीं दिखाता है। ऐसा क्यों है?
डेविड ब्राउन

जवाबों:


531

यदि आप IIS 7 (और / या 64-बिट OS मशीन) पर 32-बिट अनुप्रयोग चलाने का प्रयास करते हैं, तो आपको वही त्रुटि मिलेगी। इसलिए, IIS 7 से, एप्लिकेशन के पूल पर राइट क्लिक करें और "उन्नत सेटिंग्स" पर जाएं और "सक्षम करें 32-बिट एप्लिकेशन" को "TRUE" में बदलें।

अपनी वेबसाइट को पुनरारंभ करें और इसे काम करना चाहिए।

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


1
ओह मेरे दिन जब मैं यह जवाब था तो अतिरिक्त आईआईएस घटक स्थापित करने के आसपास मछली पकड़ रहा हूं ... क्या कोई इस विकल्प को चयनित करने के लिए एक नकारात्मक सुझाव दे सकता है?
नोटाडाहो

3
इस संबंध में प्रदर्शन के सवाल पर एक अच्छी चर्चा है: stackoverflow.com/questions/507820/…
बेन पावर

मैं SharpSvn के साथ एक समस्या है और यह मदद नहीं करता है। :( इस सभा से बहुत गलत है, मैं आपको बताता हूँ ...
user2173353

4
यह उत्तर मेरे लिए एक wtf है, क्योंकि प्रश्न में IIS का जिक्र नहीं है!
kristianp

129

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


बहुत बहुत धन्यवाद। यह मुझे भी मिला। कॉन्फ़िगरेशन मैनेजर में चेक किए गए बिल्ड और अब यह काम करता है (WPF डेस्कटॉप एप्लिकेशन)।
रात 13:30

1
यदि आपने उपरोक्त सभी कार्य किए हैं, और अपनी प्लेटफ़ॉर्म सेटिंग की जाँच की है, तो कॉन्फ़िगरेशन सेटिंग्स बनाएँ, समाधान को साफ़ करें और यह अभी भी काम नहीं कर रहा है - DLL के सभी उदाहरणों को खोजें और उन्हें हटा दें।
विल कैल्डरवुड

वी.एस. 2015 के साथ इस अभी भी मान्य है - हालांकि मैं पुनः आरंभ करने के लिए :) जरूरत नहीं थी
increddibelly

बस! अपनी कॉन्फ़िगरेशन प्रबंधक सेटिंग्स पर फिर से जाएँ उत्तर है।
एंडीयुक

74

में विजुअल स्टूडियो , सही अपने क्लिक करें परियोजना -> बाएँ फलक पर क्लिक करें बिल्ड टैब,

प्रोजेक्ट गुण, बिल्ड टैब

प्लेटफ़ॉर्म लक्ष्य के तहत x86 (या आमतौर पर आर्किटेक्चर जिसे आप लिंक कर रहे हैं, उस लाइब्रेरी के साथ मिलान करने के लिए चुनें)

परियोजना के गुण, प्लेटफ़ॉर्म लक्ष्य

मुझे उम्मीद है इससे किसी को सहायता मिलेगी! :)


2
इसने मेरा मुद्दा VS2013 में तय किया, मैंने पाया कि "प्लेटफ़ॉर्म टारगेट" को "किसी भी सीपीयू" के रूप में छोड़ना है, लेकिन "32-बिट को प्राथमिकता दें" चेक बॉक्स को चेक करें।
user1069816

2
हालाँकि आपको .NET 4.5 या उच्चतर का उपयोग करने की आवश्यकता है, ताकि "32-बिट को प्राथमिकता दें" चेक बॉक्स
user1069816

1
हां, लेकिन मैंने अपने प्रोजेक्ट को 'एनी सीपीयू' में 'x64' में बदल दिया। मेरी 32 बिट परियोजना ठीक काम कर रही है, लेकिन उसी कोड को मैंने 64 बिट में बदल दिया, वह परियोजना 32 बिट के रूप में ठीक काम नहीं कर रही है। क्या आप मुझे उचित 64 बिट रूपांतरण प्रक्रिया दे सकते हैं ...
Ismayil S

@IsmayilS सुनिश्चित करें कि आप उस लाइब्रेरी के 64-बिट संस्करण का उपयोग कर रहे हैं जिसे आप लिंक कर रहे हैं
Marvin Thobejane

53

मुझे भी बस यही समस्या थी। यहां सभी सुझावों की कोशिश की, लेकिन उन्होंने मदद नहीं की।

मुझे यह जांचने के लिए एक और चीज़ मिली जिसने इसे मेरे लिए तय किया। विज़ुअल स्टूडियो में, प्रोजेक्ट पर राइट-क्लिक करें और "गुण" खोलें। "संकलन" (या "बिल्ड") टैब पर क्लिक करें और फिर नीचे "उन्नत संकलन विकल्प" पर क्लिक करें।

ड्रॉपडाउन "लक्ष्य सीपीयू" की जांच करें। यह आपके द्वारा बनाए जा रहे "प्लेटफार्म" से मेल खाना चाहिए। यही है, यदि आप "किसी भी सीपीयू" का निर्माण कर रहे हैं, तो "लक्ष्य सीपीयू" को "कोई भी सीपीयू" कहना चाहिए। अपने सभी प्लेटफार्मों के माध्यम से उन्हें सक्रिय करें और इस सेटिंग को जांचें।


2
और हम में से केवल कंपाइलर का उपयोग करने के लिए, मेरा फिक्स कंपाइलर झंडे में "/ प्लेटफॉर्म: x86" जोड़ना था।
अर्चिन

यह मेरे लिए भी तय है। मुझे "बिल्ड" टैब पर "प्लेटफ़ॉर्म लक्ष्य" को समायोजित करना था।
Jowen

यदि आप 64 बिट पर हैं, तो "32 बिट पसंद करें" ध्वज को भी देखें। मुझे इसे मेरे लिए निष्क्रिय करना पड़ा।
N4ppeL

51

यदि आप एप्लिकेशन को चलाने के लिए ग्रीन एरो बटन पर क्लिक करते समय इस त्रुटि का सामना करते हैं, लेकिन फिर भी ऐप को 64 बिट में चलाना चाहते हैं। आप इसे वीएस 2013, 2015, 2017 और 2019 में कर सकते हैं

पर जाएँ: उपकरण> विकल्प> परियोजनाएँ और समाधान> वेब परियोजनाएँ> IIS एक्सप्रेस के 64 बिट संस्करण का उपयोग करें


3
धन्यवाद। मैंने बहुत कोशिश की और कुछ भी मदद नहीं की। तुम मेरे जीवन रक्षक हो। मेरे पास 64 बिट ओएस है, एक 64 बिट विजुअल स्टूडियो स्थापित किया है [जो अभी भी अज्ञात कारण से 32 बिट के रूप में चलता है]। जब मैंने अपना प्लेटफ़ॉर्म लक्ष्य x64 में रखा, तो यह BadImageFormatException में त्रुटि थी। अपने फिक्स के साथ, इसने काम किया। मैंने तुम्हें उत्थान दिया। आप रॉक
SKCS कमल

मुझे खुशी है कि मैं मदद कर सकता हूं :)
पैबिंबो

यही उत्तर मुझे चाहिए। आपका बहुत बहुत धन्यवाद!
yushulx

बहुत बहुत धन्यवाद, इससे समस्या हल हो गई। यह विजुअल स्टूडियो 2017 32-बिट प्रक्रिया के साथ अच्छी तरह से काम करता है।
samir105

1
अभी भी वीएस 2019 के साथ काम करता है, धन्यवाद
जेक गैस्टन

36

यदि आप किसी भी CPU का उपयोग कर रहे हैं , तो आप इस समस्या का सामना कर सकते हैं यदि Prefer 32-बिट विकल्प की जाँच की जाती है:

सुनिश्चित करें कि आप इस विकल्प को प्रोजेक्ट की संपत्ति के बिल्ड टैब में अनचेक करें !

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


3
यह मददगार होगा अगर आप यह संकेत दे सकें कि विजुअल स्टूडियो में यह विकल्प कहां है।
trysis

@trysis, यह विकल्प प्रोजेक्ट सेटिंग्स फलक के बिल्ड पेज में है।
आकर्षित नोक

1
मैं कह रहा था कि इसे लगाना मददगार होगा। जैसा कि यह जवाब है, यह बताने के लिए कोई संदर्भ नहीं है कि स्टैकऑवरफ्लो के नए उपयोगकर्ता, जहां इसे ढूंढना है।
trysis

इस रूप को पाने का मार्ग क्या है? मैं इसे नहीं ढूँढ सकता
एडॉल्फो कोर्रिया

Visual Studio में, प्रोजेक्ट पर राइट क्लिक करें और 'गुण' चुनें।
ड्रू नोक

8

इस पोस्ट के लिए थोड़ा सा विषय, लेकिन इस त्रुटि संदेश की खोज मुझे यहाँ ले आई।

यदि आप टीम सिस्टम के माध्यम से निर्माण कर रहे हैं और यह त्रुटि हो रही है, तो बिल्ड डेफिनिशन प्रोसेस टैब में "MSBuild Platform" सेटिंग है। यदि यह "ऑटो" पर सेट है, तो आप इस समस्या का अनुभव कर सकते हैं। इसे "X86" में बदलना भी त्रुटि को हल कर सकता है।


यह मैं क्या अनुभव कर रहा था के लिए निकटतम जवाब है। मेरे पास एक dll था जो x86 होना चाहिए था। मैंने इसे दूसरे प्रोजेक्ट में इस्तेमाल किया, जो कि डिफ़ॉल्ट रूप से AnyCPU था। उन्हें बस मैच की जरूरत है। इस मामले में, इससे बहुत फर्क नहीं पड़ा, इसलिए मैंने नई परियोजना को x86 में बदल दिया।
greg

8

मेरे मामले में मैं C # में एक देशी DLL का उपयोग कर रहा था। यह DLL अन्य DLL के जोड़े पर निर्भर था जो गायब थे। एक बार उन अन्य DLL को जोड़ दिया गया तो सब कुछ काम कर गया।


4

@ अंपायम्बो के उत्तर पर निर्माण

उन्होंने कहा: टूल: विकल्प> विकल्प> परियोजनाएं और समाधान> वेब प्रोजेक्ट> IIS एक्सप्रेस के 64 बिट संस्करण का उपयोग करें

मेरे सहकर्मी ने यह बॉक्स चेक किया था (उसने स्पष्ट रूप से इसकी तलाश की थी), लेकिन प्रश्न में त्रुटि संदेश था। कुछ घंटों के बाद उसने बॉक्स को अनचेक किया और फिर से चेक किया। लो और निहारना: कोड अब सफलता के साथ चला।

ऐसा लगता है, दो जगह हैं जहां इस बॉक्स की स्थिति को बचाया नहीं गया है जो सिंक से बाहर हो गया है। अन- और इसे रीचेक करके फिर से सिंक किया।

अधिक जानकार उपयोगकर्ताओं के लिए प्रश्न: क्या पिछले हफ्ते (वीएस 2015 के लिए) अपडेट या कुछ था जो राज्यों को डी-सिंक किया गया था?


3

इस उत्तर को भी देखें , जिससे मेरे लिए वही समस्या हल हो गई।

लुईस मैक द्वारा 5/12/2010 को सुबह 8:50 बजे पोस्ट किया गया था, मुझे एक ही समस्या मिली है, केवल एक विशिष्ट परियोजना के लिए जब 64-बिट मशीन पर संकलन। काम करने के लिए SEEMS को ठीक करने के लिए इमेज स्ट्रीम में किसी एक चरित्र को मैन्युअल रूप से बदलना है, ताकि उपयोगकर्ता द्वारा डिज़ाइन किए गए समय या प्रपत्र को संपादित किया जा सके।

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

में बदलो

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

यही कारण है 00LjAuMC4w को वापस 0yLjAuMC4w पंक्ति के अंत में (0y को 00 वापस)


1
लिंक का एक संक्षिप्त सारांश सहायक होगा @Shaul :)
मार्विन थोबजाने

शानदार। धन्यवाद, ब्रीफिंग आपकी टिप्पणी में सामग्री जोड़ता है
मार्विन थोबजाने

2

मेरे मामले में, मैं एक छोटे से .exe का उपयोग कर रहा हूं जो संदर्भित DLL को प्रतिबिंब के माध्यम से पुनः लोड करता है। इसलिए मैं सिर्फ इन चरणों को करता हूं जो मेरा दिन बचाता है:

समाधान खोजकर्ता पर प्रोजेक्ट गुणों से, बिल्ड टैब पर, मैं लक्ष्य platfrom x86 का चयन करता हूं


2

मेरे मामले में, मैं MSTest के माध्यम से परीक्षण चला रहा था और मुझे पता चला कि मैं परीक्षण निर्देशिका में 32-बिट और 64-बिट DLL दोनों को तैनात कर रहा था। कार्यक्रम 64-बिट DLL का पक्ष ले रहा था और इसे विफल कर रहा था।

TL; DR सुनिश्चित करें कि आप केवल 32-बिट DLL परीक्षण के लिए तैनात करते हैं।


2

हमारे पास एक समान मुद्दा था और हम इसे x86 को प्लेटफ़ॉर्म लक्ष्य निर्धारित करके ठीक करने में कामयाब रहे। प्रोजेक्ट गुण-> निर्माण


तो x86 dll x64 से अलग हैं? वहाँ एक संदर्भित dll फ़ाइल पर यह पता लगाने का एक तरीका है?
NoBugs

@NoBugs लगता है कि आप कर सकते हैं। इस धागे
जो

1

मुझे यह मुद्दा 'विंडोज' तरीके से हल हुआ। मेरी सभी सेटिंग्स की जांच करने के बाद, समाधान को साफ करना और उसका पुनर्निर्माण करना, मैं बस समाधान को बंद करता हूं और इसे फिर से खोल देता हूं। तब यह काम किया, इसलिए वीएस को शायद सफाई के दौरान कुछ सामान से छुटकारा नहीं मिला। जब तार्किक समाधान काम नहीं करते हैं, मैं आमतौर पर अतार्किक (या प्रतीत होता है कि अतार्किक) की ओर मुड़ जाता हूं। विंडोज मुझे निराश नहीं करता है। :)


1

मैं सर्वर पर .NET संस्करण में अपने बिल्ड संस्करण का मिलान करके इस समस्या को ठीक करने में सक्षम था।

मैंने डबल क्लिक किया .exe सिर्फ यह देखने के लिए कि क्या होगा और इसने मुझे 4.5 स्थापित करने के लिए कहा था ...।

इसलिए मैंने 4.0 को डाउनग्रेड किया और यह काम कर गया!

इसलिए सुनिश्चित करें कि आपके संस्करण मेल खाते हैं। यह मेरे देव बॉक्स पर ठीक चला, लेकिन सर्वर में पुराने .NET संस्करण था।


1

मेरे मामले में यह फ़ाइल की गलत सामग्री थी। DLL को वेब से डाउनलोड किया गया था, लेकिन DLL की सामग्री HTML पृष्ठ थी: D यह जाँचने का प्रयास करें कि क्या यह द्विआधारी फ़ाइल है, यदि यह सही DLL जैसा लगता है :)


1

हम .NET कोर में एक ही समस्या आ रहे थे। समाधान 32-बिट। नेटकोर रनटाइम डाउनलोड करना था, और आपका प्रोजेक्ट लक्ष्य होना थाx86

अपनी csprojफ़ाइल में जोड़ें

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

यह एक विंडोज मशीन के लिए इस्तेमाल किया गया था, आपको लिनक्स / ओएसएक्स के लिए पथ और इस तरह समायोजित करना होगा



0

1: पर जाएं: उपकरण> विकल्प> परियोजनाएं और समाधान> वेब परियोजनाएं> IIS एक्सप्रेस 2 के 64 बिट संस्करण का उपयोग करें: वेब वेबसाइट परियोजना के लिए सेटिंग में नीचे परिवर्तन। यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.