प्रकार को एक असेंबली में परिभाषित किया गया है जिसे संदर्भित नहीं किया गया है, कारण कैसे ढूंढें?


83

मुझे पता है कि त्रुटि संदेश आम है और इस त्रुटि के बारे में SO पर बहुत सारे प्रश्न हैं, लेकिन अभी तक किसी भी समाधान ने मेरी मदद नहीं की है, इसलिए मैंने सवाल पूछने का फैसला किया। इसी तरह के अधिकांश प्रश्नों का अंतर मुझे App_Code निर्देशिका का उपयोग करना है।

त्रुटि संदेश:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
assembly that is not referenced. You must add a reference to assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

मूल फाइल:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

सुझावों का पालन यहाँ और यहाँ , मैं Project.Rights.dll के सभी उदाहरणों नष्ट कर दिया है सी के अंदर: \ Windows \ Microsoft.NET /*.* के अनुसार इस , मैं जाँच की है, तो सवाल में .cs फ़ाइलें "संकलन" के निर्माण कार्रवाई सेट है । वे करते हैं। मैंने यह भी जाँच लिया है कि "Project.Rights.OperationsProvider" प्रकार वाली .cs फ़ाइल को App_ode निर्देशिका में तैनात किया गया है।

किसी कारण से, अनुप्रयोग App_Code निर्देशिका में प्रकार की तलाश नहीं कर रहा है। चूंकि मैंने Project.Rights.dll के सभी उदाहरण हटा दिए हैं (जो मुझे पता है), मुझे नहीं पता कि त्रुटि संदेश का उल्लेख किस विधानसभा में है।


6
आप एक वर्ग का उपयोग कर रहे हैं (मान लें कि A ) एक विधि / संपत्ति / कुछ प्रकार की परियोजना को उजागर करता है। कंपाइलर को यह जानने की जरूरत है कि उसके बाद वह उस विधानसभा (Project.Rights) को खोजेगा या नहीं। यदि यह नहीं मिलता है (क्योंकि आपके वेब साइट प्रोजेक्ट में इसका संदर्भ नहीं है) ... आपको यह त्रुटि मिलती है। समाधान: अपने सिस्टम से उस असेंबली को न हटाएं !!! इसके लिए एक संदर्भ जोड़ें।
Adriano Repetti

2
टूल्स - ऑप्शन्स - प्रोजेक्ट्स और सॉल्यूशंस पर जाएं - बिल्ड और रन - दोनों वर्बोसिट्स को विस्तृत पर सेट करने का प्रयास करें। यह आपको बताएगा कि निर्भरता क्या है, और संकलक इसे कहां देख रहा है।
डैनलुडविग 10

जवाबों:


100

जब आपको यह त्रुटि मिलती है तो यह हमेशा स्पष्ट नहीं होता है कि क्या चल रहा है, लेकिन जैसा कि त्रुटि कहती है - आप एक संदर्भ याद कर रहे हैं। एक उदाहरण के रूप में कोड की निम्नलिखित पंक्ति लें:

MyObjectType a = new MyObjectType("parameter");

यह काफी सरल लगता है और आपने शायद "MyObjectType" को सही ढंग से संदर्भित किया है। लेकिन "MyObjectType" कंस्ट्रक्टर के लिए ओवरलोड में से एक को एक प्रकार बताता है जिसे आपने संदर्भित नहीं किया है। उदाहरण के लिए एक अधिभार के रूप में परिभाषित किया गया है:

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

यह कम से कम एक मामला है जहां आपको यह त्रुटि मिलेगी। इसलिए, इस प्रकार के पैटर्न की तलाश करें, जहां आपने प्रकार का उल्लेख किया है, लेकिन सभी प्रकार के गुण या विधि पैरामीटर नहीं हैं जो उस प्रकार के कार्यों के लिए संभव हैं।

उम्मीद है कि यह कम से कम आपको सही दिशा में जा रहा है!


16
विस्तार विधियों के बारे में ध्यान दें: यदि दो वर्गों में एक ही नाम के साथ विस्तार विधियां हैं, तो एक प्रकार के पैरामीटर दूसरे प्रकार से विस्तार विधि का उपयोग "संक्रमित" कर सकते हैं।
अथारी

@ अथारी शुक्रिया, मैंने कभी नहीं सोचा होगा कि
डेव कजिनो

बस कुछ देर देखने के बाद इस जवाब पर मंथन हुआ। यह वास्तव में मेरी समस्या है और आपका स्पष्टीकरण बहुत मददगार था। धन्यवाद भार
डायने

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

1
यह वास्तव में अजीब लगता है, लेकिन मुझे यह त्रुटि मिली क्योंकि मैं असेंबली नामों में से एक के मामले में बेमेल था (ऐसा लगता है कि नगेट संवेदनशील था?) मेरे पास एक पुस्तकालय सी संदर्भ पुस्तकालय बी और ए लाइब्रेरी बी भी पुस्तकालय ए को संदर्भित करते थे, लेकिन ए को 'ए' के ​​बजाय 'ए' नाम का उपयोग करते हुए एक निर्भरता के रूप में पैक किया गया था। लाइब्रेरी सी का निर्माण, मुझे यह त्रुटि तब तक मिलती रही जब तक मैंने बी में निर्भरता के नाम को सही नहीं किया!
तोलू

49

परियोजनाओं में लक्ष्य रूपरेखा की जाँच करें।

मेरे मामले में "आपको असेंबली का एक संदर्भ जोड़ना होगा" वास्तव में इसका मतलब था कि कॉलर और संदर्भ परियोजनाओं में समान लक्ष्य रूपरेखा नहीं थी। कॉलर परियोजना में .Net 4.5 था, लेकिन संदर्भित पुस्तकालय में 4.6.1 लक्ष्य था।

मुझे यकीन है, कि एमएस कंपाइलर होशियार हो सकता है और अधिक सार्थक त्रुटि संदेश लॉग कर सकता है। मैंने https://github.com/dotnet/roslyn/issues/14756 पर एक सुझाव जोड़ा है


16

मेरे मामले में ऐसा इसलिए था क्योंकि NuGet पैकेज अपडेट करने से केवल कुछ dll पर निर्भरता के संदर्भ में अद्यतन होते थे, लेकिन मेरे समाधान में सभी प्रोजेक्ट नहीं - जिसके परिणामस्वरूप परस्पर विरोधी संस्करण थे। का उपयोग करते हुए एक ग्रेप शैली उपकरण मेरी समाधान में * .csproj फ़ाइलों के भीतर पाठ खोज करने के लिए यह अभी भी परियोजनाओं को अपडेट करने की जरूरत है कि देखने के लिए तो आसान था।


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

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

7

जब आपको यह त्रुटि मिलती है, तो इसका मतलब है कि आप जिस कोड का उपयोग कर रहे हैं, वह एक प्रकार का संदर्भ देता है जो एक असेंबली में है, लेकिन असेंबली आपके प्रोजेक्ट का हिस्सा नहीं है, इसलिए यह इसका उपयोग नहीं कर सकता है।

Project.Rights.dll को हटाना आप जो चाहते हैं उसके विपरीत है। आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी परियोजना विधानसभा को संदर्भित कर सकती है। इसलिए इसे या तो ग्लोबल असेंबली कैश में रखा जाना चाहिए या आपके वेब एप्लिकेशन के ~ / बिन डायरेक्टरी में।

संपादित करें-यदि आप असेंबली का उपयोग नहीं करना चाहते हैं, तो इसे हटाना उचित समाधान नहीं है। इसके बजाय, आपको अपने कोड में सभी संदर्भों को निकालना होगा। चूंकि असेंबली को आपके द्वारा लिखे गए कोड की सीधे आवश्यकता नहीं है, लेकिन इसके बजाय कुछ और जो आप संदर्भित कर रहे हैं, आपको उस संदर्भित असेंबली को किसी ऐसी चीज से बदलना होगा जिसमें Project.Rights.dll निर्भरता के रूप में नहीं है।


2
मैं विधानसभा का उपयोग नहीं कर सकता, यह एक आवश्यकता है। मुझे इससे छुटकारा पाने और App_Code निर्देशिका के अंदर वर्ग को संग्रहीत करने की आवश्यकता है। मुझे पता है कि यह कैसा लगता है, मेरा विश्वास करो। एक एप्लिकेशन को बदलने का काम सौंपा जा रहा है, इसलिए सभी व्यावसायिक तर्क DLL के बजाय App_Code के अंदर संग्रहीत किए जाते हैं ... मजेदार नहीं है।
afaf12

1
नहीं, इसका मतलब है कि वह किसी चीज का उपयोग इसके संदर्भ में कर रहा है (ऐसा नहीं कि वह सीधे प्रयोग कर रहा है)। @ afaf12 अगर आपको इससे छुटकारा पाना है ... आपको यह जांचना होगा कि इसका उपयोग कौन कर रहा है (इसे अप्रत्यक्ष संदर्भ के रूप में कल्पना करें )। आप बस App_Code निर्देशिका में कोड पेस्ट नहीं कर सकते, कोई भी संकलित असेंबली अभी भी मूल (और बाहरी) एक का संदर्भ देगी ...
Adriano Repetti

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

4

मेरे मामले में, मैं एक पुस्तकालय का उल्लेख कर रहा था जिसे गलत प्लेटफ़ॉर्म / कॉन्फ़िगरेशन के लिए बनाया जा रहा था (मैंने अभी संदर्भित पुस्तकालय बनाया था)।

इसके अलावा, मैं Visual Studio कॉन्फ़िगरेशन प्रबंधक में समस्या को ठीक करने में असमर्थ था - इस लाइब्रेरी के लिए नए प्लेटफ़ॉर्म और कॉन्फ़िगरेशन को स्विच करने और बनाने में असमर्थ। मैंने उस परियोजना के लिए फ़ाइल के ProjectConfigurationPlatformsअनुभाग में प्रविष्टियों को सही करके इसे ठीक किया .sln। इसके सभी क्रमपरिवर्तन सेट किए गए थे Debug|Any CPU(मुझे यकीन नहीं है कि मैंने ऐसा कैसे किया)। मैंने टूटी परियोजना के लिए एक काम करने वाले प्रोजेक्ट के लिए प्रविष्टियों को ओवरराइड किया और प्रत्येक प्रविष्टि के लिए GUID को बदल दिया।

कार्यशील परियोजना के लिए प्रविष्टियाँ

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

दूषित प्रोजेक्ट के लिए प्रविष्टियाँ

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

अब दूषित प्रविष्टियाँ ठीक हो गई हैं

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

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


मेरे लिए यह समान था। VIsual Studio ने मेरे कुछ प्रोजेक्ट्स FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #) से 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET) के लिए GUID बदल दिए हैं । मैंने उन्हें बदलने के बाद सब कुछ ठीक किया।
स्कॉर 4

3

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


1

जब मैंने .NET असेंबली टैब से संदर्भ जोड़ने की कोशिश की है तो यह मेरे लिए काम नहीं किया। हालांकि, यह काम किया है, जब मैंने C: \ Windows \ Microsoft.NET \ फ्रेमवर्क \ v4.0.303 के साथ BROWSE के साथ संदर्भ जोड़ा है


0

मुख्य कारण में से एक DLL की संपत्ति हो सकती है, इससे पहले कि आपको specific version propertyयह सच है कि यह गलत है की जाँच करने के लिए किसी भी चीज़ को करने से पहले

कारण: हो सकता है कि जब आप इसे बनाते हैं तो स्रोत कोड अन्य (पुराने) संस्करण के साथ जुड़ जाता है, लेकिन यह लाइब्रेरी नए अपडेट के साथ अपग्रेड हो गई है जो अब असेंबली में अलग है कैश और आपका एप्लिकेशन नए DLL प्राप्त करने के लिए मना किया गया है, और specific version propertyआपके एपलैकेट को अक्षम करने के बाद मुक्त हो जाएगा DLL संदर्भों के नए संस्करण को पाने के लिए


0

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


0

इसका मतलब यह भी हो सकता है कि आप एक पुस्तकालय का उपयोग करें, जो (सार्वजनिक) प्रकारों को उजागर करता है जो एक पुस्तकालय में परिभाषित हैं। यहां तक ​​कि जब आप इनका उपयोग विशेष रूप से अपने पुस्तकालय में नहीं करते हैं (जो निर्माण नहीं करता है)।

यह संभवत: आपको रोकता है कि आप एक कोड का उपयोग कर रहे हैं जो एक वर्ग का उपयोग करता है (जो इसके हस्ताक्षर में संदर्भित लाइब्रेरी से प्रकार हैं) जो आप उपयोग नहीं कर सकते हैं।


0

मेरे लिए त्रुटि दिखाई देने का कारण यह था कि WebForm जहां त्रुटि की सूचना दी गई थी, उसे किसी अन्य फ़ोल्डर से स्थानांतरित कर दिया गया था, लेकिन इसके कोडफाइल वर्ग का नाम अपरिवर्तित रहा और वास्तविक पथ के अनुरूप नहीं था।

प्रारंभिक स्थिति:
मूल फ़ाइल पथ: /Folder1/Subfolder1/MyWebForm.aspx.cs
मूल कोडफ़ाइल श्रेणी का नाम: Folder1_Subfolder1_MyWebForm

फ़ाइल ले जाने के बाद:
फ़ाइल पथ: /Folder1/MyWebForm.aspx.cs
कोडफ़ाइल वर्ग का नाम (अपरिवर्तित, दिखाई गई त्रुटि के साथ): Folder1_Subfolder1_MyWebForm

समाधान:
नाम बदलें अपने codefile वर्ग Folder1_Subfolder1_MyWebForm
के लिए एक इसी के साथ नया पथ :Folder1_MyWebForm

सभी एक बार - समस्या हल हो गई, कोई त्रुटि रिपोर्टिंग नहीं ..


0

प्रकार 'Domain.tblUser' को असेंबली में परिभाषित किया गया है जिसे संदर्भित नहीं किया गया है। आपको असेंबली 'डोमेन, संस्करण = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null' का संदर्भ जोड़ना होगा।

**Solved:**
 Add reference of my domain library layer to my web app libary layer

नोट: सुनिश्चित करें कि आपके संदर्भ आपके अनुसार सही हैं DI कंटेनर


0

मेरे मामले में यह था क्योंकि मैं इस्तेमाल किया

निष्पत्ति संचालक

के बीच BLLऔर DALclasses.when मैं BLLअनुप्रयोग परत में परत का उपयोग करना चाहते हैं मुझे यह त्रुटि मिली। मैं बदल गया

निहित संचालक

सेवा

स्पष्ट ऑपरेटर

यह ठीक है। धन्यवाद


0

मेरे मामले में उल्लिखित dll का संस्करण वास्तव में उस नए की तुलना में नया था जो मेरे पास पहले था।

मुझे बस पिछली रिलीज़ पर वापस जाने की ज़रूरत थी और उसने इसे ठीक किया।


0

मेरे लिए, यह परियोजना के कारण प्रत्यक्ष और अप्रत्यक्ष रूप से (एक अन्य निर्भरता के माध्यम से) बाउंसी कैसल के दो अलग-अलग बिल्ड को संदर्भित करता था, जिसमें अलग-अलग विधानसभा नाम थे। बाउंसी कैसल बिल्ड में से एक NuGet पैकेज था, अन्य एक GHHub से डाउनलोड किए गए स्रोत का डिबग बिल्ड था। दोनों नाममात्र संस्करण 1.8.1 थे, लेकिन GitHub कोड की परियोजना सेटिंग्स ने BouncyCastle को असेंबली का नाम सेट किया जबकि NuGet पैकेज में असेंबली का नाम BouncyCastle.Crypto था। इस प्रकार, विधानसभा सेटिंग्स को संरेखित करते हुए, प्रोजेक्ट सेटिंग्स को बदलना, समस्या को ठीक करता है।


1
मेरा सुझाव है कि आप अपने उत्तर को और अधिक सहायक बनाकर यह बता सकते हैं कि आपने इसे कैसे तय किया।
स्टीफन कैनेडी

0

मुझे एक समान समस्या है, और मैं RuntimeFrameworkVersion को हटा देता हूं, और समस्या ठीक हो गई थी।

1.1.1 या निकालने का प्रयास करें


0

मेरे पास एक नए बनाए गए समाधान पर यह मुद्दा था जो मौजूदा परियोजनाओं का उपयोग करता था। किसी कारण से, एक परियोजना एक अन्य परियोजना को "देख" नहीं सकती थी, भले ही उसके पास हर दूसरी परियोजना के समान संदर्भ था, और संदर्भित परियोजना भी निर्माण कर रही थी। मुझे संदेह है कि कई लक्ष्य रूपरेखाओं के साथ कुछ करने का पता लगाने में यह विफल हो रहा था, क्योंकि यह एक ढांचे में निर्माण कर रहा था, लेकिन दूसरे में नहीं।

सफाई और पुनर्निर्माण का काम नहीं किया, और वी.एस. को फिर से शुरू करने से काम नहीं चला।

जो काम खत्म हुआ वह "वीएस 2019 के लिए डेवलपर कमांड प्रॉम्प्ट" खोल रहा था और फिर एक msbuild MySolution.slnकमांड जारी कर रहा था। यह सफलतापूर्वक पूरा हुआ और बाद में VS ने सफलतापूर्वक निर्माण करना शुरू कर दिया।


-3

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

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