DLL लोड करने में असमर्थ (मॉड्यूल HRESULT नहीं मिल सका: 0x8007007E)


113

मेरे पास unmanaged C ++ API कोड वाली dll लाइब्रेरी है जिसे मुझे अपने .NET 4.0 एप्लिकेशन में उपयोग करने की आवश्यकता है। लेकिन हर विधि मैं अपने dll को लोड करने की कोशिश करता हूं मुझे एक त्रुटि मिलती है:

DLL 'MyOwn.dll' लोड करने में असमर्थ: निर्दिष्ट मॉड्यूल नहीं मिला। (HRESULT से अपवाद: 0x8007007E)

मैंने इंटरनेट पर पाए जाने वाले विले सॉल्यूशंस को पढ़ा और आजमाया है। कुछ भी काम नहीं करता है..

मैंने निम्नलिखित विधियों का उपयोग करने की कोशिश की है:

[DllImport("MyOwn.dll",  CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
    string WorkDirectory, ref StringBuilder ErrorMessage);

जब मैंने इस लेख का अनुसरण करने का प्रयास किया और जब मैंने यह उदाहरण (डाउनलोड किए गए कोड से) चलाया तो यह बिना किसी समस्या के चलता है (उपयोग किया गया dll बिन / डिबग फ़ोल्डर में है)

मैंने अपने dll की प्रतिलिपि बनाई है (सभी फाइलों के साथ यह मेरे बिन फ़ोल्डर में निर्भर करता है)।

मैंने भी इस दृष्टिकोण की कोशिश की, लेकिन वही त्रुटि मिली:

[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern  int MyproIni(string DBname, string DBuser_pass, 
    string WorkDirectory, ref StringBuilder ErrorMessage);

कोई सुझाव?

जवाबों:


90

विंडोज पर मुझे जो कुछ याद है उससे dll के लिए खोज क्रम है:

  1. वर्तमान निर्देशिका
  2. सिस्टम फ़ोल्डर, C:\windows\system32 or c:\windows\SysWOW64(64-बिट बॉक्स पर 32-बिट प्रक्रिया के लिए)।
  3. Pathपर्यावरण चर से पढ़ना

इसके अलावा, मैं DLL की निर्भरता की जाँच करूँगा, विजुअल स्टूडियो के साथ प्रदान की गई निर्भरता वॉकर यहाँ आपकी सहायता कर सकती है, इसे मुफ्त में डाउनलोड भी किया जा सकता है: http ://www.d dependencywalker.com


4
कुछ निर्भरता गायब है (Oracle और IE से कुछ dll)। ओरेकल को स्थापित करने की आवश्यकता है क्योंकि मेरा डीएल उस पर निर्भर करता है..तो मुझे पता चल जाएगा :) डिपेंडेंसीवल्कर के साथ समस्या मिली;)
इंगीमार एंड्रेसन

कोई चिंता नहीं, यह मेरे लिए कई घंटे सिर को खरोंचने से बचाती है, बहुत कम उपकरण! :-)
प्रदर्शन ११

1
डिपेंडेंसीवॉकर का सुझाव देने के लिए कीथ हॉलिगन को +1। इसने मुझे बताया कि सभी निर्भरताओं में एक ही CPU प्रकार (x86 / x64) नहीं था। मैंने अपने एप्लिकेशन के बिन फ़ोल्डर में समान CPU प्रकार वाली सभी फ़ाइलों की प्रतिलिपि बनाई, और इसने समस्या का समाधान किया।
दिलीगंतकर्मा

6
हर dll मैं अपने सिस्टम पर पा सकता है DependencyWalker का दावा है कि विभिन्न CPU प्रकारों के साथ एक त्रुटि है - यहां तक ​​कि System.Web.Mvc.dll। यहाँ किसी तरह का झूठा अलार्म लगाया गया है।
पांडावूड

2
मेरे मामले में समस्या डिबग के लिए संकलित सी ++ डीएलएल को लोड करने का प्रयास कर रही थी। इसके लिए C ++ डिबग रनटाइम की जरूरत है, जिसका मतलब है कि आपको Visual Studio इंस्टॉल करना होगा। या रिलीज़ के लिए DLL को पुन: लिखें, और C ++ रनटाइम वितरण योग्य स्थापित करें।
RenniePet

42

आप आवश्यक DLL निर्भरता का पता लगाने के लिए डंपबिन टूल का उपयोग कर सकते हैं:

dumpbin /DEPENDENTS my.dll

यह आपको बताएगा कि आपके DLL को किस DLL को लोड करना है। विशेष रूप से MSVCR * .dll के लिए देखें। मैंने देखा है कि आपका त्रुटि कोड तब होता है जब सही Visual C ++ Redistributable स्थापित नहीं होता है।

आप Microsoft वेबसाइट से "विज़ुअल सी ++ पुनर्वितरण पैकेज विजुअल स्टूडियो 2013 के लिए" प्राप्त कर सकते हैं। यह c: \ windows \ system32 \ MSVCR120.dll स्थापित करता है

फ़ाइल नाम में, 120 = 12.0 = विज़ुअल स्टूडियो 2013।

सावधान रहें कि आपके पास अपने DLL के टारगेट प्लेटफॉर्म के लिए सही Visual Studio संस्करण (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 ...) सही आर्किटेक्चर (x64 या x86) है और साथ ही आपको सावधान रहने की भी आवश्यकता है डिबग बनाता है। DLL का डीबग बिल्ड MSVCR120d.dll पर निर्भर करता है, जो लाइब्रेरी का एक डीबग संस्करण है, जो विज़ुअल स्टूडियो के साथ स्थापित होता है, लेकिन Redistributable पैकेज द्वारा नहीं।


5
वीएस सी ++ को फिर से जोड़ना इसमें मेरे लिए पुनर्वितरण था! v10.0 (2010) की जरूरत है। बहुत बहुत धन्यवाद !!!
थियागो सिल्वा

क्या यह बताने का कोई तरीका है कि पुनर्वितरण के 64-बिट या 32-बिट संस्करणों की आवश्यकता है या नहीं?
बीवी

1
डंपबिन / सभी आपको बताएंगे कि क्या my.dll x64 का x86 है
एंथनी हेवर्ड

1
जो लोग अभी भी इस समस्या से ग्रस्त हैं, यदि आप debugद्विआधारी का उपयोग करते हैं , तो C ++ रनटाइम रिडिएंटवेबल्स संस्करण को ठीक उसी तरह की आवश्यकता होती है जैसे आपने इसे बनाया था।
स्काईलाइन 75489

@ skyline75489 की टिप्पणी ने मेरे लिए दिन बचा लिया। C ++ लाइब्रेरी ने मेरी मशीन पर ठीक काम किया लेकिन VS को msvcr के डिबग वर्जन से जोड़ने के कारण हर जगह लोड करने में असफल रहा।
जासूसी

14

यह एक 'कीचड़' है, लेकिन आप कम से कम इसे विवेक-परीक्षण के लिए उपयोग कर सकते हैं: अपने कोड में DLL के लिए कठिन कोडिंग का प्रयास करें

[DllImport(@"C:\\mycompany\\MyDLL.dll")]

यह कहने के बाद; मेरे मामले में dumpbin /DEPENDENTS@ anthony-hayward द्वारा सुझाए अनुसार चल रहे हैं , और मेरे कार्य निर्देशिका में सूचीबद्ध DLL के 32-बिट संस्करणों की नकल करने से मेरे लिए यह समस्या हल हो गई है।

संदेश सिर्फ एक भ्रामक है, क्योंकि यह "मेरा" नहीं है जिसे लोड नहीं किया जा सकता है - यह निर्भरता है


12

DLL बिन फ़ोल्डर में होना चाहिए।

विज़ुअल स्टूडियो में, मैं अपने प्रोजेक्ट में Dll जोड़ता हूं (संदर्भ में नहीं, लेकिन "मौजूदा फ़ाइल जोड़ें")। इसके बाद "कॉपी टू आउटपुट डायरेक्टरी" प्रॉपर्टी को dll के लिए "यदि नया है तो कॉपी करें" सेट करें।


11

Dll के पूर्ण पथ में प्रवेश करने का प्रयास करें। यदि यह काम नहीं करता है, तो dll को सिस्टम 32 फ़ोल्डर में कॉपी करने का प्रयास करें।


3
क्या यह सब निर्भरता System32 फ़ोल्डर में है और मेरे dll कहीं और है?
इंगमार एंड्रेसन

निर्भरता भी खिड़कियों के अनुसार खोज की जाएगी dll खोज पथ क्रम के अनुसार stackoverflow.com/a/9003290/4434329

4

सुनिश्चित करें कि आपके अपने dll की सभी निर्भरता dll के पास मौजूद हैं, या अंदर हैं System32


4

एक बहुत ही मजेदार बात है (और एक तकनीकी प्रासंगिकता है) जो आपके घंटों को बर्बाद कर सकती है इसलिए इसे यहाँ साझा करने के बारे में सोचा -

मैंने एक कंसोल एप्लीकेशन प्रोजेक्ट ConsoleApplication1और एक क्लास लाइब्रेरी प्रोजेक्ट बनायाClassLibrary1

सभी कोड जो p / invoke बना रहे थे, मौजूद थे ClassLibrary1.dll। इसलिए दृश्य स्टूडियो से एप्लिकेशन को डीबग करने से पहले मैंने सी ++ अप्रबंधित असेंबली ( myUnmanagedFunctions.dll) को प्रोजेक्ट की \bin\debug\निर्देशिका में कॉपी कर दिया ClassLibrary1ताकि इसे सीएलआर द्वारा रन-टाइम पर लोड किया जा सके।

मैं मिलता रहा

DLL लोड करने में असमर्थ

घंटों तक त्रुटि। बाद में मुझे एहसास हुआ कि ऐसी सभी अप्रबंधित असेंबली जिन्हें लोड किया जाना है \bin\debug, उन्हें स्टार्ट-अप प्रोजेक्ट की निर्देशिका में कॉपी करने की आवश्यकता हैConsoleApplication1 जो आमतौर पर एक जीत फॉर्म, कंसोल या वेब एप्लिकेशन है।

तो कृपया सावधान रहें Current Directoryस्वीकार किए गए उत्तर में वास्तव Current Directoryमें मुख्य निष्पादन योग्य का मतलब है जहां से आप आवेदन प्रक्रिया शुरू कर रहे हैं। एक स्पष्ट चीज़ की तरह दिखता है, लेकिन कई बार ऐसा नहीं हो सकता है।

सबक सीखा - हमेशा एक ही डायरेक्टरी में अनमैन्डेड डीएलएस को रखें ताकि यह सुनिश्चित किया जा सके कि इसे शुरू किया जा सके।


यह मेरे लिए भी निश्चित चीजें हैं। इस परियोजना के बजाय मुख्य परियोजना में DLLs लगाने के लिए अजीब तरह का लगता है, जो वास्तव में उनका उपयोग कर रहा है, हालांकि ...
शॉन दुगन

@SeanDuggan ऐसा इसलिए है क्योंकि यह एक "डायनेमिक लिंकिंग लाइब्रेरी" है जिसका अर्थ है कि इसका उपयोग (लोडेड) रन टाइम में किया जाता है, क्योंकि स्टैटिक लाइब्रेरीज़ जो कि लिंकिंग टाइम पर उपयोग की जाती हैं।
m4l490n

मैंने dll को bin\Debugऔर obj\Debugनिर्देशिकाओं में जोड़ने की कोशिश की है और मुझे "DLL लोड करने में असमर्थ" मिल रहा है
m4l490n

3

फ़्यूज़न लॉगिंग चालू करें, यह प्रश्न देखें कि यह कैसे करना है। मिश्रित-मोड एप्लिकेशन लोड करने की समस्याओं को डीबग करना एक सही शाही दर्द हो सकता है। फ्यूजन लॉगिंग एक बड़ी मदद हो सकती है।


2

सुनिश्चित करें कि आपने बिल्ड प्लेटफ़ॉर्म लक्ष्य x86 या x64 पर सेट किया है ताकि यह आपके DLL के साथ संगत हो - जिसे 32 बिट प्लेटफ़ॉर्म के लिए संकलित किया जा सकता है।


2

यदि DLL और .NET प्रोजेक्ट एक ही समाधान में हैं और आप हर बार संकलन और चलाना चाहते हैं, तो आप .NET प्रोजेक्ट के गुणों पर राइट क्लिक कर सकते हैं, ईवेंट बना सकते हैं, फिर पोस्ट-बिल्ड इवेंट के लिए निम्न जैसा कुछ जोड़ सकते हैं कमांड लाइन:

copy $(SolutionDir)Debug\MyOwn.dll .

यह मूल रूप से एक डॉस लाइन है, और जहां आपके DLL का निर्माण किया जा रहा है, उसके आधार पर आप ट्वीक कर सकते हैं।


2

जब पीसी का परीक्षण करने के लिए मैंने अपने आवेदन को तैनात किया तो मुझे भी यही समस्या थी। समस्या था विकास पीसी था msvcp110d.dllऔर msvcr110d.dllनहीं बल्कि परीक्षण पीसी।

मैंने "Visual Studio C ++ 11.0 DebugCRT (x86)" को इंस्टाल्डशिल्ड में मर्ज मॉड्यूल जोड़ा और यह काम कर गया। आशा है कि यह किसी और के लिए मददगार होगा।


2

मेरे मामले में एक अप्रबंधित dll दूसरे पर निर्भर था जो गायब था। उस स्थिति में त्रुटि गुम होने के बजाय मौजूदा dll को इंगित करेगी जो वास्तव में भ्रमित हो सकती है।

मेरे मामले में वास्तव में ऐसा ही हुआ था। मनाइए कि यह किसी और के लिए सहायक हो।


1

मुझे लगता है कि आपके अप्रबंधित पुस्तकालय को एक अभिव्यक्ति की आवश्यकता है।
यहां बताया गया है कि इसे अपने बाइनरी में कैसे जोड़ा जाए। और यहाँ क्यों है।

सारांश में, आपके बॉक्स में कई पुनर्वितरण योग्य पुस्तकालय संस्करण स्थापित किए जा सकते हैं, लेकिन उनमें से केवल एक को आपके ऐप को संतुष्ट करना चाहिए, और यह डिफ़ॉल्ट नहीं हो सकता है, इसलिए आपको सिस्टम को उस संस्करण को बताने की आवश्यकता है जो आपके पुस्तकालय की आवश्यकता है, इसीलिए यह प्रकट होता है।


1

सेटअप : 32-बिट विंडोज 7

संदर्भ : एक पीसीआई-जीपीआईबी चालक स्थापित किया है जो मैं उपरोक्त मुद्दे के कारण संवाद करने में असमर्थ था।

संक्षिप्त उत्तर : ड्राइवर को पुनर्स्थापित करें।

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

तथ्य यह है कि मैं नियंत्रण कक्ष के कार्यक्रमों और सुविधाओं के तहत अनइंस्टालर को खोजने में असमर्थ था, खराब स्थापना का एक और संकेतक है। मुझे ड्राइवर री-इंस्टॉलेशन की अनुमति देने के लिए मैन्युअल रूप से * .dll of \ system32 और रजिस्ट्री कुंजियों के एक जोड़े को हटाना पड़ा।

मुद्दा तय हुआ।

अप्रत्याशित हिस्सा यह था कि सभी निर्भरता मॉड्यूल को हल नहीं किया गया था। फिर भी, *। Dll of interest अब संदर्भित किया जा सकता है।


1

मैं एक ही समस्या को लेकर आया हूं, मेरे मामले में मेरे पास दो 32 बिट पीसी थे। .NET4.5 स्थापित के साथ एक और अन्य एक ताजा पीसी था।

मेरे 32-बिट cpp dll (रिलीज़ मोड बिल्ड) .NET इंस्टॉल पीसी के साथ ठीक काम कर रहा था, लेकिन ताजा पीसी के साथ नहीं जहां मुझे नीचे त्रुटि मिली

DLL 'PrinterSettings.dll' लोड करने में असमर्थ: निर्दिष्ट मॉड्यूल नहीं मिला। (HRESULT से अपवाद: 0x8007007E)

आखिरकार,

मैंने अभी अपना प्रोजेक्ट डिबग मोड कॉन्फ़िगरेशन में बनाया था और इस समय मेरा cpp dll ठीक काम कर रहा था।


0

C # वातावरण में अप्रबंधित c / c ++ dll फ़ाइल का उपयोग करते समय भी इसी समस्या का सामना करना पड़ा।

1. 32bit या 64 बिट सीपीयू के साथ dll की संगतता का परीक्षण किया।

2. DLL .bin फ़ोल्डर, system32 / sysWOW64, या दिए गए पथ के सही पथ का परीक्षण किया।

3. अगर पीडीबी (प्रोग्राम डेटाबेस) फाइल गायब हैं। यह वीडियो देखें आपको pdb फ़ाइलों के बारे में सबसे अच्छी जानकारी देता है।

64 बिट सिस्टम में 32-बिट C / C ++ बाइनरी कोड चलाते समय प्लेटफॉर्म की असंगति के कारण यह उत्पन्न हो सकता है। आप इसे बिल्ड> कॉन्फ़िगरेशन प्रबंधक से बदल सकते हैं।


0

C ++ Dll in .Net फ्रेमवर्क +4 में आयात करते समय मुझे उसी समस्या का सामना करना पड़ा, मैंने अनियंत्रित प्रोजेक्ट-> गुण-> बिल्ड-> 32-बिट को प्राथमिकता दी और यह मेरे लिए हल हो गया।

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