c# परियोजना संदर्भों के लिए "प्रतिलिपि स्थानीय" संक्रमणशील है?




.net visual-studio (2)

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

नहीं वास्तव में कोई नहीं।

MSBuild वास्तव में परवाह नहीं करता है अगर संदर्भ एक अन्य प्रोजेक्ट को समाधान में या किसी DLL में इंगित करता है

यदि ProjectA ProjectA ProjectB ProjectA ProjectB बनाने के लिए ProjectA ProjectB पर निर्भर करता है तो पहले से ही (और अप-टू-डेट) बनाया जा सकता है, तो MSBuild उसके डीएलएल (इसके सी # कोड नहीं) को खींच देगा और इसे ProjectA को लिंक करेगा।

डीएलएल की बजाय एक प्रोजेक्ट संदर्भ जोड़ना आपकी सुविधा के लिए "वाक्यविन्यास चीनी" है: इस प्रकार MSBuild जानता है कि संदर्भित परियोजना के उत्पादन को चुनना चाहिए, जो भी उत्पादन होता है

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

क्या अन्य दो डीएलएल भी आउटपुट डायरेक्टरी में कॉपी हो जाएंगे?

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

एक उदाहरण यह समाधान लेआउट हो सकता है:

  • MySolution
    • MySolution.ConsoleApplication
    • MySolution.FirstDependency
    • MySolution.SecondDependency
    • MySolution.ThirdDependency
    • MySolution.FourthDependency

इस निर्भरता श्रृंखला के साथ:

  • MySolution.ConsoleApplication
    • MySolution.FirstDependency
      • MySolution.SecondDependency
        • MySolution.ThirdDependency
        • MySolution.FourthDependency

यदि आप इस समाधान का निर्माण करते हैं तो आप देखेंगे कि MySolution.ConsoleApplication आउटपुट निर्देशिका में MySolution.ConsoleApplication लिए MySolution.FourthDependencyMySolution.FourthDependency , MySolution.FourthDependencyMySolution.SecondDependency और MySolution.FourthDependencyMySolution.FourthDependency MySolution.ThirdDependency लेकिन MySolution.FourthDependency लिए कोई डीएलएल नहीं है।

ऐसा क्यों है? जब MSBuild MySolution.SecondDependency बनाता है। MySolution.SecondDependency यह देखता है कि MySolution.FourthDependency को घोषित निर्भरता है, लेकिन चूंकि यह MySolution.FourthDependency MySolution.SecondDependency कोड से किसी भी प्रकार के तत्व का कोई भी उपयोग नहीं खोज पा रहा है, यह कुछ "अनुकूलन" करने का निर्णय करता है और आउटपुट से MySolution.FourthDependency विधानसभा omits

जब मैं NuGet AutoMapper के माध्यम से "गहरी निर्भरता" के लिए जोड़ा गया था, तो यह वही मुद्दा मुझे पहले ही बताता है: ऑटोमैपर जोड़कर दो विधानसभा संदर्भ, AutoMapper और AutoMapper.Net4 नेट 4 जोड़ता है, जहां दूसरी असेंबली पहले प्रतिबिंब के द्वारा तब लोड की जाती है जब उसे प्रदर्शन की आवश्यकता होती है .NET ढाँचा 4 द्वारा शुरू की गई नई संग्रह ऑब्जेक्ट्स पर कुछ प्रकार की कार्रवाई। चूंकि दूसरी असेंबली प्रतिबिंब के माध्यम से भरी हुई है MSBuild सोचता है कि यह अप्रयुक्त है और इसे प्रतिलिपि करने के लिए परेशान नहीं करता है

तो, हाँ , वे तब तक कॉपी किए जाएंगे जब तक आप उन्हें प्रत्यक्ष रूप से उपयोग नहीं कर रहे हैं और प्रतिबिंब के माध्यम से नहीं।

क्या यह कहीं दस्तावेज है?

यह व्यवहार MSBuild की "सुविधा" लगता है, मुझे माइक्रोसॉफ्ट के कुछ लोगों द्वारा एक ब्लॉग पोस्ट मिला जब मुझे इस समस्या का अनुभव हुआ, लेकिन मुझे इस समय फिर से नहीं मिल रहा है।

WRT। प्रस्तावित शिकार: चूंकि यह यहां खोजी प्रश्न से जुड़ा हुआ प्रश्न के विपरीत है, मैं यह सोचने के लिए चाहूंगा कि यह एक धोखा नहीं है।

सबसे पहले , मैंने पढ़ा था "प्रतिलिपि स्थानीय" के लिए और परियोजना संदर्भ के लिए सबसे अच्छा अभ्यास क्या है? (यह भी) और मुझे इसे बाहर भी देखना होगा, लेकिन इस पर सामान्य प्रतिक्रिया प्राप्त करना जरूरी लगता है क्योंकि इस सामग्री पर डॉक्स भयानक हैं और मैं केवल वीएस -2010 पर हूं और शायद उन्होंने नए संस्करणों में कुछ बदल दिया है जो हो जाएगा जानकर अच्छा लगा।

दूसरा , मुझे केवल इस प्रश्न के लिए परियोजना संदर्भ में दिलचस्पी है क्योंकि मैंने पढ़ा है कि जीएसी से असेंबलियों को अलग तरह से संभाला जाता है और जीएसी मेरी समस्या के लिए अप्रासंगिक है।

तीसरा , सुझाए गए शिकार को पढ़ने के बाद, लेकिन @ अलबिरो द्वारा यहां बहुत अच्छा जवाब मिला, यह भी दिखाई देगा कि फाइल निर्भरता को अलग करना महत्वपूर्ण है, जहां पर निर्भरता एक डीएलएल असेंबली फ़ाइल और परियोजना निर्भरताओं का संदर्भ देती है (यानी मैं क्या पूछ रहा हूँ के बारे में), जहां पर निर्भरता एक परियोजना का संदर्भ देती है और उस परियोजना की अन्तर्निहित आउटपुट फ़ाइल है।

वैसे भी, यहाँ स्थिति है, कुछ अजीब मुझे लगता है, लेकिन फिर भी:

  • 2 सी # निष्पादन योग्य परियोजनाएं
  • एन सी # डीएलएल विधानसभा परियोजनाएं
  • 2 निष्पादनयोग्यों में अलग आउटपुट निर्देशिकाएं होती हैं क्योंकि उन्हें अलग से तैनात किया जाएगा और इस तरह वे डेवलपर मशीन पर भी अलग होंगे
  • 2 निष्पादनयोग्य कुछ DLL विधानसभाओं (जो एक दूसरे पर निर्भर हो सकते हैं) पर निर्भरता है
  • तीन आउटपुट निर्देशिकाएं हैं:
    • /x1 1 /x1 1 निष्पादन योग्य परियोजना के लिए
    • /x2 2 निष्पादन योग्य 2 परियोजना के लिए
    • सभी डीएलएल असेंबलियों के लिए /lib

DLL विधानसभाओं ने सभी को अपने प्रोजेक्ट संदर्भों के लिए Copy Local सेट को false बना दिया है, क्योंकि वे सभी एक ही आउटपुट निर्देशिका में निर्मित होते हैं।

2 निष्पादन योग्य परियोजनाओं ने सभी डीएलएल असेंबली परियोजना संदर्भों के लिए सीधे Copy Local को true पर सेट किया है, ताकि डीएलएल को क्रमशः /x1 /x2 में कॉपी किया जा सके।

सवाल अब wrt है। डीएलएल के लिए जो कि निष्पादन योग्य प्रोजेक्ट द्वारा सीधे संदर्भित नहीं हैं, लेकिन केवल संदर्भित रूप से एक संदर्भित विधानसभा के माध्यम से: असेंबलियों, जो कि केवल एक अन्य विधानसभा के माध्यम से पारदर्शी रूप से संदर्भित होते हैं, को निष्पादन योग्य के आउटपुट फ़ोल्डर में कॉपी किया जाता है, जब "प्रतिलिपि स्थानीय" पर सेट होता है पहली विधानसभा पर सच है?

उदाहरण:

  • x1.csproj (जैसेऑपुटपुट = x1/one.exe )
    • संदर्भ: Copy Local = *true* साथ lib/a.dll dlA.csproj (जैसे आउटपुट = lib/a.dll )
    • (b.dll पर कोई सीधा संदर्भ नहीं)
  • dlA.csproj (जैसे आउटपुट = lib/a.dll )
    • संदर्भ: Copy Local = **false** साथ dlB.csproj (जैसे आउटपुट = lib/b.dll )
    • (सीडीएलएल पर कोई सीधा संदर्भ नहीं)
  • dlC.csproj (जैसे आउटपुट = lib/c.dll )
    • (आगे कोई प्रासंगिक संदर्भ नहीं)

इस प्रकार, हमारे पास one.exe -> a.dll -> b.dll -> c.dll पर एक तार्किक निर्भरता है, जहां केवल एक। a.dll को स्पष्ट रूप से one.exe की आउटपुट निर्देशिका में कॉपी किया one.exeक्या अन्य दो डीएलएल भी आउटपुट डायरेक्टरी में कॉपी हो जाएंगे? क्या यह कहीं दस्तावेज है?

और, हाँ, मैंने इसे करने की कोशिश की और, हाँ, यह काम करने लगता है, लेकिन मैंने इसे अभी तक कठिन नहीं किया है और वैसे भी वहां कुछ भी हो सकता है जो मुझे याद हो सकता है। (और भी सवाल wrt है। किसी भी अधिकारी डॉक्स।)


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

अगर MSBuild एक ही निर्देशिका में इस तरह के एक असेंबली मिल सकता है तो यह स्वचालित रूप से इसे प्रतिलिपि होगा यदि नहीं, तो यह चुपचाप प्रतिलिपि को छोड़ देगा।

इस से, आप विफलता मोड को निकाल सकते हैं। यह अप्रबंधित DLL को कॉपी नहीं कर सकता है, वे मेटाडेटा में दिखाई नहीं देते हैं। यह विधानसभाओं की प्रतिलिपि नहीं कर सकता है कि आपके पास विधानसभा के माध्यम से अप्रत्यक्ष निर्भरता है। लोड / से (), वे मेटाडेटा में भी प्रकट नहीं होते हैं यह उन विधानसभाओं की प्रतिलिपि नहीं कर सकता है जो अभी तक नहीं बनाए गए हैं, एक बिल्ड ऑर्डर समस्या है और यह असेंबलियों को प्रतिलिपि नहीं कर सकता है जिनकी प्रतिलिपि लोकल संपत्ति आपने गलत पर सेट की है। कौन सी आम तौर पर केवल एक वैध विकल्प है यदि विधानसभा जीएसी में मौजूद है, तो कोई प्रतिलिपि आवश्यक नहीं है।

ऐसे मामलों के लिए आपको सहायता की ज़रूरत है, पोस्ट-बिल्ड इवेंट में XCOPY को नौकरी मिल जाती है।





copy-local