2012-01-25 10 views
77

मेरे पास अप्रबंधित सी ++ एपीआई कोड के साथ डीएलएल लाइब्रेरी है, मुझे अपने .NET 4.0 एप्लिकेशन में उपयोग करने की आवश्यकता है।DLL लोड करने में असमर्थ (मॉड्यूल HRESULT नहीं मिला: 0x8007007E)

Unable to load DLL 'MyOwn.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

मैंने पढ़ा है और करने की कोशिश की severa समाधान मैं इंटरनेट पर पाया है है: लेकिन हर विधि मैं अपने DLL लोड करने की कोशिश मैं कोई त्रुटि मिलती है। कुछ भी नहीं काम करता है .. निम्नलिखित तरीकों का उपयोग कर

मैं कोशिश की है:

[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); 

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

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

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

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

कोई सुझाव?

उत्तर

11

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

+3

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

4

सुनिश्चित करें कि आपके स्वयं के डीएल की सभी निर्भरता डीएल के पास मौजूद हैं, या System32 में।

74

क्या मैं विंडोज पर खोज एक dll के लिए आदेश याद से है:

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

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

+2

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

+0

कोई चिंता नहीं, यह मेरे लिए कई घंटे के सिर खरोंच से बचा है, बहुत छोटा टूल! :-) – display101

+0

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

2

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

28

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

dumpbin /DEPENDENTS my.dll 

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

आप माइक्रोसॉफ्ट वेबसाइट से "विजुअल स्टूडियो 2013 के लिए विजुअल सी ++ पुनर्वितरण योग्य पैकेज" प्राप्त कर सकते हैं। यह स्थापित करता है C: \ Windows \ System32 \ MSVCR120.dll

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

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

+4

वीएस सी ++ पुनर्वितरण जोड़ने के लिए यह मेरे लिए था! आवश्यक v10.0 (2010)। बहुत बहुत धन्यवाद !!! –

+0

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

+1

डंपबिन/सभी आपको बताएंगे कि my.dll x64 –

2

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

2

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

copy $(SolutionDir)Debug\MyOwn.dll . 

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

0

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

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

2

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

मैंने "विजुअल स्टूडियो सी ++ 11.0 डीबगसीआरटी (x86)" इंस्टॉल किए गए मॉड्यूल में मॉड्यूल मर्ज किया और यह काम किया। उम्मीद है कि यह किसी और के लिए सहायक होगा।

7

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

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

1

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

प्रसंग: ऊपर उल्लिखित समस्या के कारण हो पीसीआई-GPIB ड्राइवर है कि मैं के माध्यम से संवाद करने में असमर्थ था इंस्टॉल किया गया।

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

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

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

समस्या तय की गई।

अप्रत्याशित हिस्सा यह था कि सभी निर्भरता मॉड्यूल का समाधान नहीं हुआ था। फिर भी, रुचि के * .dll अब संदर्भित किया जा सकता है।

3

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

मैं एक सांत्वना आवेदन परियोजना ConsoleApplication1 बनाया है और एक वर्ग पुस्तकालय परियोजना ClassLibrary1

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

मैं घंटों के लिए

Unable to load DLL

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

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

सबक सीख लिया - हमेशा यह सुनिश्चित करने के लिए स्टार्ट-अप निष्पादन योग्य के रूप में उसी निर्देशिका में अनियंत्रित डीएलएस रखें।

+0

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

2

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

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

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

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

1

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

मेरी 32-बिट ठीक नेट के साथ सीपीपी dll (रिलीज़ मोड निर्माण) काम कर रहा था पीसी स्थापित लेकिन नहीं ताजा पीसी के साथ जहां मैं नीचे त्रुटि

Unable to load DLL 'PrinterSettings.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

अंत में,

I just built my project in Debug mode configuration and this time my cpp dll was working fine.

+0

मेरे लिए काम किया! धन्यवाद – SaddamBinSyed