2010-02-18 12 views
16

मेरे पास एक सी # समाधान है और इसकी कई परियोजनाओं से बना है।सी # परियोजना संदर्भ का प्रश्न

मेरे पास एक प्रोजेक्ट है जो मेरी बेससेम्ब्ली है जिसमें सभी सामान्य सूचनाएं होती हैं जो अन्य परियोजनाओं का उपयोग करती हैं। अन्य सभी परियोजनाओं में बेससेम्ब्ली के संदर्भ हैं।

मैंने अपने बेससेम्ब्लीज़ में एक डीएल संदर्भ जोड़ा, हालांकि अन्य सभी परियोजनाएं इसे देख नहीं सकतीं।

मैं इसे कैसे बना सकता हूं ताकि अन्य परियोजनाएं डीएलएल देख सकें कि बेससेम्बली संदर्भ दे रहे हैं? मैं सभी परियोजनाओं में डीएलएल जोड़ना नहीं चाहता क्योंकि यह मेरे बेससेम्ब्लीज प्रोजेक्ट के उद्देश्य को हरा देता है।

उत्तर

23

सही अन्य दृष्टिकोण आपके अन्य असेंबली के लिए अन्य डीएलएल के संदर्भ की आवश्यकता नहीं है। सही तरीके से ऐसा करने का तरीका यह है कि आपके बेस असेंबली उस डीएलएल के भीतर मौजूद किसी भी प्रकार का खुलासा नहीं करते हैं। आधार असेंबली में आपको आवश्यक सभी कार्यक्षमताओं को लपेटें, और सुनिश्चित करें कि जो कोई भी आपकी आधार असेंबली का उपभोग करता है, उसे अंतर्निहित डीएल के आधार असेंबली का कोई ज्ञान नहीं है। अन्यथा, प्रत्येक प्रोजेक्ट जो आपके बेस असेंबली का संदर्भ देगा, अगर उन्हें उस डीएल में निहित कुछ का उपयोग करने की आवश्यकता है, तो उन्हें इसका संदर्भ देना होगा।

+2

+1 आपने मुझे इसे हराया।मैं 100% –

+2

से सहमत हूं यह बड़े कोडबेस के साथ कई मामलों में व्यावहारिक नहीं है। यह एक अच्छा "सैद्धांतिक" उत्तर है, लेकिन इसे कोडिंग और परीक्षण में बहुत अधिक प्रयास की आवश्यकता होती है ताकि इसे (अक्सर) कोई मूल्य जोड़ा जा सके। मैं यह नहीं कह रहा हूं कि यह * कभी * उपयुक्त नहीं है ... –

9

.NET में कोई संक्रमणीय संदर्भ नहीं हैं। यदि किसी असेंबली को किसी अन्य संदर्भ देने की आवश्यकता है तो उसे इतना करना चाहिए, यह किसी अन्य संदर्भ से उस संदर्भ को "उत्तराधिकारी" नहीं कर सकता है।

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

3

संक्षेप में आप इसे नहीं कर सकते हैं। आपको उस डीएलएल का संदर्भ जोड़ने की आवश्यकता है जिसमें आप जिस कोड का उपयोग करने का प्रयास कर रहे हैं, अन्यथा यह इसे देखने में सक्षम नहीं होगा।

मेरे सुझाव के लिए अपने 'BaseAssemblies' परियोजना में एक परत आप अपने आवेदन जो अनिवार्य रूप से एक स्तरीय वास्तुकला बनाता से पहुँच सकते हैं बनाने के लिए किया जाएगा।

उदाहरण

आवेदन परत - IDataClass
व्यापार तर्क परत का उपयोग करता है - परिभाषित IDataClass
डेटा एक्सेस परत - MyRawDataClass (लागू करता IDataClass)

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

0

आप अपने BaseAssemblies निर्यात इंटरफेस है कि आपके "अन्य" dll द्वारा लागू किया जाना हो सकता है। इसके अतिरिक्त, आपके बेसएस्सेब्ली को उन वर्गों के लिए कुछ "वर्ग कारखाने" कार्यक्षमता की आवश्यकता है।

0

अन्य पोस्टर सही हैं: आप इसे नहीं कर सकते हैं। यह, विजुअल स्टूडियो के हिस्से पर आईएमएचओ, दयनीय है। "कर" 20 साल पहले पाई के रूप में इस स्वच्छ संभाला ...

0

कई ऐसे उदाहरण हैं जहां अपनी परियोजना के लिए संदर्भित करता हैं एक है जो बदले में बी संदर्भित करता है लेकिन जब आप का निर्माण, बी हमेशा वहाँ बिन फ़ोल्डर में नहीं है और आप केवल एहसास यह कोड चल रहा है जब यह। एक संबंधित SO प्रश्न HERE है। लोगों ने इसे विचित्र तरीकों से हल किया है, लेकिन मुझे विशेष रूप से जॉन हंटर द्वारा समाधान पसंद आया। यह SO thread उस समाधान पर भी चर्चा करता है जहां आप वांछित परिणाम प्राप्त करने के लिए बिल्ड ईवेंट का उपयोग करते हैं।

संबंधित मुद्दे