Dll का संदर्भ नहीं जोड़ा जा सका


95

जब मैं C # एप्लिकेशन में एक संदर्भ के रूप में एक .dll फ़ाइल जोड़ता हूं, तो यह एक त्रुटि दिखाता है:

".... dll" का संदर्भ नहीं जोड़ा जा सकता। कृपया सुनिश्चित करें कि फ़ाइल सुलभ है और यह एक मान्य असेंबली या COM घटक है।

ILDissassembler का कहना है कि कोई वैध सीएलआर हेडर नहीं है, इसलिए मैं इसे regsvr32 का उपयोग करके पंजीकृत करने का प्रयास करता हूं और इससे आपको एक और जानकारी मिलती है:

मॉड्यूल "" लोड किया गया था, लेकिन DLLRegisterServer के लिए कॉल त्रुटि कोड '0x80004005' के साथ विफल हुआ

मैं 64 बिट विंडोज 7 मशीन पर VS2010 अंतिम संस्करण का उपयोग कर रहा हूं। क्या समस्या हो सकती है?

किसी भी संकेत / उत्तर के लिए धन्यवाद

जवाबों:


53

निम्नलिखित ने मेरे लिए काम किया:

संक्षिप्त जवाब

कमांड लाइन (cmd) के माध्यम से निम्नलिखित चलाएँ:

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

और आपके लिए एक वैध dll बनाया जाएगा।

लंबा उत्तर

  • सेमी खोलें

  • TlbImp.exe खोजें। संभवतः C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin में स्थित है। यदि आप इसे अपने मूल फ़ोल्डर (C: \ or D :) में नहीं ले जा सकते और चला सकते हैं:

    dir tlbimp.exe /s              //this will locate the file.
  • Tlbimp.exe चलाएं और इसके पीछे अपना dll डालें। उदाहरण: यदि आपका dll cvextern.dll है। तुम दौड़ सकते हो:

    TlbImp.exe cvextern.dll
  • Tlbimp.exe के एक ही फ़ोल्डर में एक नया dll बनाया गया है। आप अपने प्रोजेक्ट में संदर्भ के रूप में उपयोग कर सकते हैं।

5
TlbImp.exe तक पहुंचने का एक और तरीका है विजुअल स्टूडियो कमांड प्रॉम्प्ट को खोलना।
स्कॉट

75
@ मैं यह कोशिश कर रहा हूँ, मुझे TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.कोई सुझाव मिला ?
दिनेशकुमार

1
इनपुट फ़ाइल C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'एक मान्य प्रकार की लाइब्रेरी नहीं है
क्रिस्टीन

7
दिनेशकुमार पोन्नुसामी द्वारा बताई गई एक ही त्रुटि होने पर। कृपया मेरी मदद करें
मृत्यु

1
आपको TLBMP का उपयोग करने की आवश्यकता कब होगी? आम तौर पर VS2015 में यदि आप संदर्भ विंडो से COM DLL का संदर्भ जोड़ते हैं तो यह आपके लिए यह सब ध्यान रखता है।
UUDdLrLrSs

20

यदि आप .NET असेंबली है, तो आप किसी प्रोजेक्ट में DLL (या EXE) जोड़ सकते हैं। यदि यह नहीं है तो आपको यह त्रुटि संदेश दिखाई देगा।

regsvr32 भी DLL में संरचना और निर्यात समारोह के बारे में कुछ धारणाएँ बनाता है। मुझे इसका इस्तेमाल करते हुए कुछ समय हो गया है, लेकिन इसे COM सर्वरों के पंजीकरण के साथ करना है, इसलिए कुछ निश्चित प्रवेश बिंदु उपलब्ध होने चाहिए। यदि regsvr32 विफल रहता है तो DLL उन प्रवेश बिंदुओं को प्रदान नहीं करता है और DLL में COM घटक नहीं होता है।

आप केवल DLL का उपयोग करने के लिए किसी अन्य गैर- .NET बाइनरी की तरह इसे आयात करने का मौका देते हैं, उदाहरण के लिए जब आप कुछ Win32 API का उपयोग करते हैं। एक पुराना MSDN पत्रिका आलेख है जो सहायक हो सकता है। लेख प्राप्त करने के लिए जानकारी के लिए निम्न अद्यतन देखें।

अपडेट 12 मार्च 2018: MSDN मैगज़ीन का लिंक अब अगस्त 2010 में उपयोग किए गए काम नहीं करता। जेसन क्लार्क के लेख का शीर्षक है ".NET स्तंभ: Win32 DLLs को C में P / Invoke के साथ"। यह MSDN पत्रिका के जुलाई 2010 के अंक में प्रकाशित हुआ था। "वेबैक मशीन" में इस समय यहाँ आलेख है (स्वरूपण सीमित है)। संपूर्ण MSDN पत्रिका समस्या जुलाई 2010 यहाँ उपलब्ध है (केवल HCM प्रारूप, निर्देश यहाँ HCM फ़ाइलों का उपयोग कैसे करें )।


क्या यह सुनिश्चित करने का एक तरीका है कि संकलक आउटपुट फ़ोल्डर में एक dd डालता है, भले ही वह संदर्भ न हो?
काइल डेलाने

1
@KyleDelaney मुझे नहीं लगता कि संकलक ऐसा कर सकता है। मैं प्रोजेक्ट / समाधान के पूर्व-बिल्ड / पोस्ट-बिल्ड इवेंट में कॉपी या xcopy कमांड डालने पर विचार करूंगा। हालाँकि, यह मैनुअल है, लेकिन आम तौर पर संदर्भ बहुत बार नहीं बदलते हैं और एक उचित परीक्षण सूट उन मामलों को पकड़ना चाहिए जहां आप पूर्व-बिल्ड / पोस्ट-बिल्ड ईवेंट में निष्पादित कमांड को अपडेट करना भूल गए थे।
मैनफ्रेड

उत्तर के लिए धन्यवाद!
काइल डेलाने

लेख का लिंक मृत है।
रोनाल्ड

@ रालोद धन्यवाद। हां, लिंक वास्तव में टूट गया है। Microsoft केवल एक अलग URL पर संपूर्ण MSDN मैगज़ीन समस्या का HCM प्रारूप प्रदान करता है। वेबैक मशीन में HTML प्रारूप में बस लेख का एक स्नैपशॉट है जिसमें कुछ सरलीकृत उपस्थिति है। मैंने इसे प्रतिबिंबित करने के लिए उत्तर अपडेट कर दिया है और मैंने अपने उत्तर से टूटी हुई लिंक को भी हटा दिया है। उम्मीद है की यह मदद करेगा।
मैनफ्रेड

12

आंतरिक निर्भरता की जांच करने के लिए मैंने निर्भरता वॉकर का उपयोग किया जो कि dll था। पता चला कि यह VB रनटाइम msvbvm60.dll की जरूरत थी और जब से मेरे देव बॉक्स ने स्थापित किया है कि मैं इसे regsvr32 का उपयोग करके पंजीकृत करने में असमर्थ था

यह मेरे मूल प्रश्न का उत्तर है।


मेरे मामले में, मुझे उस परियोजना के लिए obj फ़ोल्डर को हटाना पड़ा जिसे मैं संदर्भित करने की कोशिश कर रहा था और फिर मैंने परियोजना का पुनर्निर्माण किया।
टोलू

7

सुनिश्चित करें कि आपका कंपाइलर x86 पर सेट है यदि आप x86 dll को संदर्भित करने का प्रयास कर रहे हैं ...

मेरे पास समान मुद्दे थे ... जैसा कि ऊपर उल्लेख किया गया है, विजुअल स्टूडियो 2012 में मेरे सी # कोड से एक्सेल फाइल तक पहुंचने के लिए ओएलईडी का उपयोग करने की कोशिश कर रहा है।

मुझे एक्सेस लाइब्रेरी के एक्सेस नहीं होने के बारे में गलतियाँ मिलती रहीं लेकिन मुझे पता था कि मैंने इसे लोड किया है।

डिबग के दौरान, यह मुझ पर हावी हो गया कि मैं 64 बिट के लिए संकलन कर रहा हूं, लेकिन कार्यालय x86 लोड है। भले ही मैंने एक्सेस लाइब्रेरी को 32 बिट के लिए लोड किया था, लेकिन यह कभी भी ऐप द्वारा उपयोग नहीं किया जा रहा था ... और इसलिए, सुलभ नहीं था।

यहाँ मैं # C में उपयोग कर रहा था:

"प्रदाता = Microsoft.ACE.OLEDB.12.0; डेटा स्रोत =" + strFilePath + "; विस्तारित गुण = 'एक्सेल 12.0 Xml; एचडीआर = हाँ'";

... मुझे एक त्रुटि मिल रही थी

जैसे ही मैंने कंपाइलर को x86 में स्विच किया, यह काम कर गया


2

मैं बस उस मुद्दे में भाग गया और कमांड प्रॉम्प्ट के साथ इसे ठीक करने के बारे में सभी स्पष्टीकरणों के बाद मैंने पाया कि यदि आप इसे सीधे प्रोजेक्ट में जोड़ते हैं तो आप प्रत्येक पृष्ठ पर लाइब्रेरी को शामिल कर सकते हैं, जिसकी आवश्यकता है


2

मुझे अपने प्रोजेक्ट में WinSCard.dll आयात करने में समान समस्या है। मैं इस तरह सीधे dll से आयात करने के साथ सौदा:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

आप इसे अलग प्रोजेक्ट में जोड़ सकते हैं और फिर अपने मुख्य प्रोजेक्ट से एक संदर्भ जोड़ सकते हैं।


1

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


1

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

[DllImport("...")]
public static extern void MyFunction();

हो सकता है कि किसी प्रकार का रैपर DLL हो, जिसे आप वास्तव में संदर्भित कर रहे हों और जिसमें DLL आयात हो।

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

यह समस्या इसलिए है क्योंकि आप जिस असेंबली को जोड़ने का प्रयास कर रहे हैं वह केवल x86 या x64 प्रोसेसर आर्किटेक्चर के लिए लक्षित और संकलित है ।

बस निर्माण -> कॉन्फ़िगरेशन प्रबंधक में लक्ष्य प्लेटफ़ॉर्म को x86 या x64 में बदलने का प्रयास करें ।


1

मुझे कॉन्फ़िगरेशन प्रबंधक में x64 से आर्किटेक्चर को x86 में बदलने और मेरे 32 बिट डीएल (सी भाषा - pcProxAPI.dll) को नए फ़ोल्डर में कॉपी करने की आवश्यकता है जो इसे बनाया गया है .. यह नीचे दिए गए "सैशस" द्वारा वर्णित चरणों के शीर्ष पर है ।

C: \ परियोजनाओं .. \ बिन \ 86 \ डीबग


यह वह मेरे लिए भी मुद्दा था।
दुष्ट १।

लेकिन अगर डिफ़ॉल्ट x86 नहीं है और न ही x64? लेकिन .... "कोई सीपीयू" दिखाया ...?
गमरू

codeproject.com/articles/1160645/… कोई भी सीपीयू काम कर सकता है अगर आप 32 बिट
डीएल की

1

मुझे एक ही समस्या थी जब मैंने एक डीएल जोड़ने की कोशिश की थी जिसे मैंने सी ++ में कोडित किया था अपने नए सी # प्रोजेक्ट में। मुझे पता चला कि C ++ परियोजना के गुणों को सेट करने की आवश्यकता है, जो मेरा dll है:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

क्योंकि जिस C # प्रोजेक्ट में मैं इस dll का उपयोग करना चाहता था, वह भी उसी तरह सेट किया गया था (उसी गुण को सेट किया गया था /clr)।


सॉल्यूशन एक्सप्लोरर>
प्रॉपराइज

@gumuruh यदि आपका मतलब है "clr क्या है?", तो CLR docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

मैंने इसी तरह की समस्या का सामना किया। मैं .net 1.1 प्रोजेक्ट में .net 2.0 dll के संदर्भ को जोड़ने का प्रयास कर रहा था। जब मैंने .dll के पिछले संस्करण को जोड़ने की कोशिश की थी जो .net 1.1 में अनुपालन किया गया था। यह मेरे लिए काम किया।


0

किसी और को इस मामले में मदद के लिए देख रहे हैं, या एक FileNotFoundException या FirstChanceException का अनुभव कर रहे हैं, यहाँ मेरा जवाब देखें:

Mscorlib.ni.dll - विंडोज़ फोन में 'System.IO.FileNotFoundException' प्रकार का पहला मौका अपवाद

सामान्य तौर पर आपको पूरी तरह से निश्चित होना चाहिए कि आप संदर्भ बनाने के लिए सभी आवश्यकताओं को पूरा कर रहे हैं - मुझे पता है कि यह स्पष्ट उत्तर है, लेकिन आप शायद एक अपेक्षाकृत सरल आवश्यकता की अनदेखी कर रहे हैं।


संदर्भ के संबंध में फ्रेमवर्क संस्करणों के बीच अंतर देखें - एक नए फ्रेमवर्क संस्करण का उपयोग करने वाले समय में बहुत अंतर नहीं होना चाहिए।
JHaps

0

विंडोज सर्विस लिखते समय मुझे यह त्रुटि हुई थी। मैं विजुअल स्टूडियो को प्रशासक के रूप में चला रहा था ताकि मेरी पोस्ट बिल्ड कमांड स्वचालित रूप से मेरी सेवा स्थापित कर दे। मैंने देखा कि जब मैंने सब कुछ बंद कर दिया और वीएस सामान्य रूप से (प्रशासक के रूप में नहीं) भाग गया, तो मुझे बिना किसी त्रुटि के संदर्भों को ठीक करने दें।

आशा है कि यह समाधान आपके लिए काम करता है।


0

आम तौर पर विज़ुअल स्टूडियो 2015 में आपको विज़ुअल स्टूडियो के टेम्प्लेट से C ++ -> CLR प्रोजेक्ट के रूप में dll प्रोजेक्ट बनाना चाहिए, लेकिन आप तकनीकी रूप से इस तथ्य के बाद इसे सक्षम कर सकते हैं:

महत्वपूर्ण प्रॉपर्टी को Common Language Runtime Supportआपके प्रोजेक्ट के कॉन्फ़िगरेशन में सेट किया जाता है। इसके अंतर्गत पाया जाता है Configuration Properties > General > Common Language Runtime Support

ऐसा करते समय, VS शायद 'लक्ष्य .NET फ्रेमवर्क' विकल्प को अपडेट नहीं करेगा (जैसे उसे करना चाहिए)। आप मैन्युअल रूप से अपने प्रोजेक्ट को अनलोड करके, अपने_प्रोजेक्ट .xxproj फ़ाइल को संपादित करके, Target .NET framework VersionXML टैग को जोड़ / अपडेट कर सकते हैं ।

एक नमूने के लिए, मैं एक C ++ CLR प्रोजेक्ट के रूप में एक नया समाधान बनाने और XML की जांच करने का सुझाव देता हूं, शायद यह भी यह सुनिश्चित करने के लिए अलग है कि सामान्य से बाहर बहुत महत्वपूर्ण कुछ भी नहीं है।


0

मेरा उत्तर थोड़ा देर से है, लेकिन एक त्वरित परीक्षण के रूप में, सुनिश्चित करें कि आप पुस्तकालयों के नवीनतम संस्करण का उपयोग कर रहे हैं।

मेरे मामले में एक नगेट लाइब्रेरी को अपडेट करने के बाद जो किसी अन्य लाइब्रेरी को संदर्भित कर रहा था जिससे समस्या गायब हो गई।


0

आप .dll फ़ाइल को मैन्युअल रूप से जोड़ सकते हैं। उदाहरण के लिए यदि आप अपने WPF एप्लिकेशन में एक dll फ़ाइल जोड़ना चाहते हैं, और आप इसे अपने प्रोजेक्ट में संदर्भित करने में असमर्थ हैं

(त्रुटि प्राप्त करना: ".... dll" का संदर्भ नहीं जोड़ा जा सकता। कृपया सुनिश्चित करें कि फ़ाइल सुलभ है और यह एक मान्य असेंबली या COM घटक है)

उसके बाद उस फ़ाइल और PASTE को INSTALLER प्रोजेक्ट (एप्लिकेशन फोल्डर में) में कॉपी करें।


0
  1. cmd.exe प्रारंभ करें और टाइप करें:
  2. Regsvr32% dllpath%
  3. "% dllpath%" आपके dll पथ को प्रतिस्थापित करता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.