c# - BadImageFormatException समस्या निवारण




.net (11)

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

समस्या विंडोज 7 64-बिट (देव) और विंडोज एक्सपी एसपी 3 32-बिट (लक्ष्य) सिस्टम दोनों पर मौजूद है।

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

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

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

System.BadImageFormatException was unhandled
  Message=Could not load file or assembly 'XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
  Source=XxxDevicesService
  FileName=XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  FusionLog=Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  c:\Dev\TeamE\bin\Release\XxxDevicesService.vshost.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = XXX
LOG: DisplayName = XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///c:/Dev/TeamE/bin/Release/
LOG: Initial PrivatePath = NULL
Calling assembly : XxxDevicesService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: c:\TeamE\bin\Release\XxxDevicesService.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///c:/TeamE/bin/Release/XxxDevices.DLL.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.

  StackTrace:
       at XxxDevicesService.Program.Main(String[] args)
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

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

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

विधानसभा प्रबंधक से लोड किया गया: सी: \ विंडोज \ माइक्रोसॉफ्ट.NET \ Framework64

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


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


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

मैंने अतिरिक्त ऐप कॉन्फ़िगरेशन हटा दिया और यह काम किया।


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

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


जब मुझे इस मुद्दे का सामना करना पड़ा तो निम्नलिखित ने इसे हल किया:

मैं एक ओपनसीवी डीएल को एक और एक्सई के अंदर से बुला रहा था, मेरे डीएल में पहले से ही ओपनसीवी डीएलएस जैसे हाईगुई, फीचर्स 2 डी, और आदि मेरे एक्सई फाइल के फ़ोल्डर में उपलब्ध नहीं थे। मैंने इन सभी को मेरी एक्सई परियोजना की निर्देशिका में कॉपी किया और अचानक काम किया।


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


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


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


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

  1. सुनिश्चित करें कि आपकी साइट पर वर्तमान में चल रही ऐपपूल में "32-बिट एप्लिकेशन सक्षम करें" को गलत पर सेट किया गया है।
  2. सुनिश्चित करें कि आप अपने मंच के लिए सही संस्करण का उपयोग कर रहे हैं।
  3. यदि आपको यह त्रुटि किसी वेब साइट पर मिल रही है, तो सुनिश्चित करें कि आपका एप्लिकेशन पूल सही मोड में चलाने के लिए सेट है (3.0 साइट्स 64 बिट मोड में चलनी चाहिए)
  4. आपको यह भी सुनिश्चित करना चाहिए कि दृश्य स्टूडियो में उस असेंबली का संदर्भ पैकेज फ़ोल्डर में सही फ़ाइल पर इंगित कर रहा है।
  5. सुनिश्चित करें कि आपके पास 2.0 साइटों के लिए जीएसी में स्थापित डीएलएल का सही संस्करण है।
  6. यह वेब प्रोजेक्ट के साथ डब्ल्यूएसओडीलिब्स को बढ़ावा देने के कारण भी हो सकता है।

सिस्टम पर अपनी निर्भरता हटाएं। अपने वेब में रनटाइम। कॉनफिग, यह मेरे लिए काम करता है:

<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>

पृष्ठभूमि

हमने इसे आज शुरू करना शुरू किया जब हमने आईआईएस 6.2 चलाने वाले विंडोज 2012 आर 2 सर्वर पर हमारी डब्ल्यूसीएफ सेवा को किसी भी सीसीएफयू से x64 पर स्विच किया।

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

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

उपाय

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




exception