2013-08-28 3 views
6

असेंबली निर्भरताओं के बारे में एक सूक्ष्म बिंदु है जिसे मैं समझना चाहता हूं। Wrapper.dll < - - Project.dllएक अप्रयुक्त कन्स्ट्रक्टर इस मामले में असेंबली निर्भरता क्यों करता है?

Wrapper.dll में इस तरह के रूप में एक प्रकार है

SharpDX.dll <:

public class D3DWrapperTypeA { 
    //public D3DWrapperTypeA(SharpDX.Device device) { 
    //  
    //} 

    public D3DWrapperTypeA(IntPtr devicePointer) { 
     SharpDX.Device device = new SharpDX.Device(devicePointer); 
     // etc 
    } 
} 
मैं एक परियोजना है जो इतना की तरह एक कस्टम आवरण के माध्यम से SharpDX का उपयोग करता है

इस कक्षा में, यदि मैं टिप्पणी निर्माता को अनदेखा करता हूं, तो Project.dll को SharpDX.dll का संदर्भ देना चाहिए, भले ही यह कन्स्ट्रक्टर का उपयोग न करे।

हालांकि, मैं भी तो की तरह एक और आवरण प्रकार है:

public class WrapperTypeB { 
    public SharpDX.Device GetDevice(int adapter) { 
     // etc 
    } 

    public IntPtr GetDevicePointer(int adapter) { 
     return GetDevice(adapter).NativePointer; 
    } 
} 

और यहाँ है, जब तक मैं वास्तव में GetDevice विधि है कि एक SharpDX ऑब्जेक्ट का उपयोग नहीं करते, Project.dll की जरूरत नहीं है SharpDX.dll संदर्भित करने के लिए।

यह क्यों है कि एक अप्रयुक्त कन्स्ट्रक्टर जो SharpDX प्रकार का पैरामीटर लेता है, SharpDX पर निर्भरता का कारण बनता है, जबकि एक अप्रयुक्त विधि जो SharpDX प्रकार का पैरामीटर देता है?

+0

ऐसा इसलिए नहीं है क्योंकि संकलन समय पर संकलक निर्भरता की आवश्यकता होती है जहां विधि निर्भरता केवल रनटाइम पर आवश्यक होती है? अगर मैं ईमानदार हूँ तो अनुमान लगाओ! – Liam

उत्तर

6

यह बहुत अस्पष्ट है कि आप जानते हैं कि आपके पास निर्भरता है। हालांकि आपके पास संकलन-समय निर्भरता होगी। एक रनटाइम निर्भरता व्याख्या करने के लिए बहुत कठिन होगा।

संकलन-समय निर्भरता मौजूद है क्योंकि सी # कंपाइलर जोर देता है कि इसे कन्स्ट्रक्टर के सभी अधिभारों को जानने की आवश्यकता है ताकि वह सही कॉल कर सके। यह ऐसा करने में सक्षम नहीं होगा अगर यह SharpDX के बारे में कुछ भी नहीं जानता है। डेविस अगर यह SharpDX.dll के लिए मेटाडेटा लोड नहीं कर सकता है।

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

0

दोनों स्थितियों में आपके Project.dll की निर्भरता SharpDX.dll पर निर्भर है और यह बिल्कुल सामान्य है। दोनों मामलों में SharpDX.dll आपके आउटपुट bin फ़ोल्डर में कॉपी किया जाएगा और रनटाइम पर उपयोग किया जाएगा।

पहले मामले में आपको SharpDX.dll के संदर्भ को स्पष्ट रूप से जोड़ने की आवश्यकता नहीं है जब तक आप D3DWrapperTypeA कक्षा के निर्माता को कॉल करने का प्रयास नहीं करते। भले ही आप दूसरे कन्स्ट्रक्टर को कॉल करने का प्रयास करते हैं, फिर भी आपको एक संदर्भ की आवश्यकता है।

दूसरे मामले के लिए भी सही है: जब तक आप GetDevice विधि को कभी भी कॉल नहीं करते हैं, तो आपको एक स्पष्ट संदर्भ जोड़ने की आवश्यकता नहीं है।

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