visual studio समाधान में परियोजना निर्भरताओं का उपयोग करते समय एमएसबिल्ड संदर्भों(डीएलएल फाइलों) की प्रतिलिपि नहीं करता है




visual-studio msbuild (14)

मेरे विजुअल स्टूडियो सोल्यूशन में सभी परियोजनाएं हैं (हर कोई .NET 3.5 को लक्षित करता है) - मेरी समस्या के लिए केवल ये दोनों महत्वपूर्ण हैं:

  1. MyBaseProject <- यह कक्षा लाइब्रेरी एक तृतीय-पक्ष DLL फ़ाइल (elmah.dll) का संदर्भ देती है
  2. MyWebProject1 <- इस वेब एप्लिकेशन प्रोजेक्ट में MyBaseProject का संदर्भ है

मैंने " स्टॉर्म जोड़ें ..." → "ब्राउज़ करें" टैब पर क्लिक करके विजुअल स्टूडियो 2008 में MyBaseProject के लिए elmah.dll संदर्भ जोड़ा है "elmah.dll" का चयन करना।

एल्मा संदर्भ की गुण निम्नानुसार हैं:

  • उपनाम - वैश्विक
  • स्थानीय कॉपी करें - सच
  • संस्कृति -
  • विवरण - ASP.NET के लिए लॉगिंग मॉड्यूल और हैंडलर (ELMAH) त्रुटि
  • फाइल प्रकार - असेंबली
  • पथ - डी: \ webs \ otherfolder \ _myPath \ __ उपकरण \ elmah \ Elmah.dll
  • हल - सही
  • रनटाइम संस्करण - v2.0.50727
  • निर्दिष्ट संस्करण - झूठी
  • मजबूत नाम - झूठा
  • संस्करण - 1.0.11211.0

MyWebProject1 में मैंने प्रोजेक्ट माईबेस प्रोजेक्ट का संदर्भ जोड़ा: "संदर्भ जोड़ें ..." → "प्रोजेक्ट्स" टैब → "MyBaseProject" का चयन करना। निम्नलिखित संदर्भों को छोड़कर इस संदर्भ की गुण समान हैं:

  • विवरण -
  • पथ - डी: \ webs \ CMS \ MyBaseProject \ bin \ Debug \ MyBaseProject.dll
  • संस्करण - 1.0.0.0

यदि मैं विजुअल स्टूडियो में बिल्ड चलाता हूं तो elmah.dll फ़ाइल को MyBaseProject.dll के साथ मेरी MyWebProject1 की बिन निर्देशिका में कॉपी किया गया है!

हालांकि अगर मैं समाधान के लिए एमएसबिल्ड को साफ और चलाता हूं (डी: \ webs \ CMS> सी: \ विन्डोज़ \ माइक्रोसॉफ्ट.नेट \ फ्रेमवर्क \ v3.5 \ MSBuild.exe / t: ReBuild / p: कॉन्फ़िगरेशन = डीबग MyProject.sln ) elmah.dll MyWebProject1 की बिन निर्देशिका में अनुपलब्ध है - हालांकि बिल्ड में स्वयं को कोई चेतावनी या त्रुटियां नहीं हैं!

मैंने पहले ही यह सुनिश्चित कर लिया है कि MyBaseProject के .csproj में "सत्य" मान के साथ निजी तत्व शामिल है (जो विजुअल स्टूडियो में " प्रतिलिपि स्थानीय " के लिए उपनाम होना चाहिए):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(निजी टैग डिफ़ॉल्ट रूप से .csproj के xml में प्रकट नहीं हुआ था, हालांकि विजुअल स्टूडियो ने "स्थानीय प्रतिलिपि" सत्य कहा था। मैंने "स्थानीय प्रतिलिपि" को गलत - सहेजे गए - और फिर इसे फिर से सत्य पर सेट किया - सहेजें!)

एमएसबिल्ड के साथ क्या गलत है? मैं (elmah.dll) संदर्भ को MyWebProject1 के बिन में कैसे कॉपी करूं?

मैं प्रत्येक प्रोजेक्ट के पोस्टबिल्ड कमांड में पोस्टबिल्ड कॉपी एक्शन नहीं जोड़ना चाहता हूं! (कल्पना कीजिए कि मेरी कई परियोजनाएं MyBaseProject पर निर्भर होंगी!)


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


पर एक नज़र डालें:

यह एमएसबिल्ड मंच धागा मैंने शुरू किया

आपको वहां मेरा अस्थायी समाधान / कामकाज मिलेगा!

(MyBaseProject को कुछ कोड की आवश्यकता है जो elmah.dll से कुछ वर्गों (जो भी) को संदर्भित कर रहे हैं elmah.dll को MyWebProject1 के बिन में कॉपी किया जा रहा है!)


निर्माण के दौरान उपयोग नहीं किए जाने वाले असेंबली का संदर्भ सही अभ्यास नहीं है। आपको अपनी बिल्ड फाइल को बढ़ाना चाहिए ताकि यह अतिरिक्त फाइलों की प्रतिलिपि बना सके। या तो पोस्ट बिल्ड इवेंट का उपयोग करके या संपत्ति समूह को अपडेट करके।

कुछ उदाहरण अन्य पोस्ट में पाए जा सकते हैं


मुझे भी यही समस्या थी।

जांचें कि क्या आपकी परियोजना का ढांचा संस्करण डीएल के ढांचे संस्करण के समान है जो आपने संदर्भ में रखा है।

मेरे मामले में, मेरे क्लाइंट को "फ्रेमवर्क 4 क्लाइंट" का उपयोग करके संकलित किया गया था और डीएलएल "फ्रेमवर्क 4" में था।


मैं बस इस तरह से सौदा करता हूँ। अपने संदर्भ के गुणों पर जाएं और ऐसा करें:

Set "Copy local = false"
Save
Set "Copy local = true"
Save

और बस।

विजुअल स्टूडियो 2010 प्रारंभ में नहीं रखा गया है: संदर्भ टैग में <private>True</private> और "स्थानीय प्रतिलिपि" सेटिंग को गलत बनाने के कारण यह टैग बनाने के कारण है। इसके बाद यह इसे तदनुसार सही और गलत पर सेट करेगा।


यदि आप सीधे कोड में असेंबली का उपयोग नहीं कर रहे हैं तो विजुअल स्टूडियो सहायक होने का प्रयास करते समय पता लगाता है कि इसका उपयोग नहीं किया जाता है और इसे आउटपुट में शामिल नहीं किया जाता है। मुझे यकीन नहीं है कि आप विजुअल स्टूडियो और एमएसबिल्ड के बीच अलग-अलग व्यवहार क्यों देख रहे हैं। आप बिल्ड आउटपुट को दोनों के लिए डायग्नोस्टिक में सेट करने का प्रयास कर सकते हैं और परिणामों की तुलना कर सकते हैं कि यह कहां से अलग हो जाता है।

आपके elmah.dll संदर्भ के लिए यदि आप इसे सीधे कोड में संदर्भित नहीं कर रहे हैं तो आप इसे अपने प्रोजेक्ट में एक आइटम के रूप में जोड़ सकते हैं और बिल्ड एक्शन टू Content और कॉपी टू आउटपुट डायरेक्टरी को Always


इसके लिए आपके प्रोजेक्ट में .targets फ़ाइल जोड़ने और इसे प्रोजेक्ट के अनुभाग में शामिल करने की आवश्यकता है।

प्रक्रिया के लिए यहां मेरा जवाब देखें।


जिस मुद्दे का सामना करना पड़ रहा था, मेरे पास एक परियोजना है जो लाइब्रेरी प्रोजेक्ट पर निर्भर है। निर्माण के लिए मैं इन चरणों का पालन कर रहा था:

msbuild.exe myproject.vbproj /T:Rebuild
msbuild.exe myproject.vbproj /T:Package

बेशक इसका मतलब था कि मैं बिन में अपनी लाइब्रेरी की डीएलएल फाइलों को याद कर रहा था और सबसे महत्वपूर्ण पैकेज पैकेज ज़िप फ़ाइल में था। मैंने पाया कि यह पूरी तरह से काम करता है:

msbuild.exe myproject.vbproj /T:Rebuild;Package

मुझे नहीं पता कि यह काम क्यों है या यह पहली जगह क्यों नहीं था। लेकिन उम्मीद है कि मदद करता है।


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

व्याख्या

नमूना परिदृश्य के लिए मान लीजिए कि हमारे पास प्रोजेक्ट एक्स, असेंबली ए, और असेंबली बी असेंबली एक संदर्भ असेंबली बी है, इसलिए प्रोजेक्ट एक्स में ए और बी दोनों का संदर्भ शामिल है। इसके अलावा, प्रोजेक्ट एक्स में कोड शामिल है जो असेंबली ए (उदाहरण ए। SomeFunction ())। अब, आप एक नई परियोजना वाई बनाते हैं जो परियोजना एक्स का संदर्भ देता है।

तो निर्भरता श्रृंखला इस तरह दिखती है: वाई => एक्स => ए => बी

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

उपाय

इस समस्या को हल करने के लिए आपके पास दो विकल्प हैं, जिनमें से दोनों विधानसभा बी को परियोजना वाई की बिन निर्देशिका में कॉपी किया जाएगा:

  1. परियोजना वाई में असेंबली बी के लिए एक संदर्भ जोड़ें।
  2. प्रोजेक्ट एक्स में एक फ़ाइल में डमी कोड जोड़ें जो असेंबली बी का उपयोग करता है।

व्यक्तिगत रूप से मैं कुछ कारणों से विकल्प 2 पसंद करता हूं।

  1. यदि आप भविष्य में एक और प्रोजेक्ट जोड़ते हैं जो प्रोजेक्ट एक्स का संदर्भ देता है, तो आपको असेंबली बी के संदर्भ को भी शामिल करना याद रखना होगा (जैसे आपको विकल्प 1 के साथ करना होगा)।
  2. आप स्पष्ट टिप्पणियां कह सकते हैं कि डमी कोड क्यों होना चाहिए और इसे हटाने के लिए क्यों नहीं। तो अगर कोई दुर्घटना से कोड हटा देता है (अप्रयुक्त कोड के लिए एक रिफैक्टर टूल के साथ कहें), तो आप स्रोत नियंत्रण से आसानी से देख सकते हैं कि कोड आवश्यक है और इसे पुनर्स्थापित करने के लिए। यदि आप विकल्प 1 का उपयोग करते हैं और कोई अप्रयुक्त संदर्भों को साफ़ करने के लिए एक रिफैक्टर टूल का उपयोग करता है, तो आपके पास कोई टिप्पणी नहीं है; आप देखेंगे कि एक संदर्भ .csproj फ़ाइल से हटा दिया गया था।

यहां "डमी कोड" का एक नमूना है जिसे मैं आमतौर पर जोड़ता हूं जब मुझे इस स्थिति का सामना करना पड़ता है।

    // DO NOT DELETE THIS CODE UNLESS WE NO LONGER REQUIRE ASSEMBLY A!!!
    private void DummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE()
    {
        // Assembly A is used by this file, and that assembly depends on assembly B,
        // but this project does not have any code that explicitly references assembly B. Therefore, when another project references
        // this project, this project's assembly and the assembly A get copied to the project's bin directory, but not
        // assembly B. So in order to get the required assembly B copied over, we add some dummy code here (that never
        // gets called) that references assembly B; this will flag VS/MSBuild to copy the required assembly B over as well.
        var dummyType = typeof(B.SomeClass);
        Console.WriteLine(dummyType.FullName);
    }

मुझे बस एक ही समस्या थी और यह इस तथ्य के कारण हुआ कि उसी समाधान में 2 परियोजनाएं तृतीय पक्ष पुस्तकालय के एक अलग संस्करण का संदर्भ दे रही थीं।

एक बार जब मैंने सभी संदर्भों को सही किया, तो सबकुछ पूरी तरह से काम करता था।


.NET Framework 4 क्लाइंट प्रोफाइल से .NET Framework 4 में लक्ष्य ढांचे को बदलने से मेरे लिए यह समस्या ठीक हो गई।

तो अपने उदाहरण में: MyWebProject1 पर .NET Framework 4 पर लक्ष्य ढांचे को सेट करें


मैं बस एक बहुत ही समान मुद्दे में भाग गया। विजुअल स्टूडियो 2010 का उपयोग करते समय संकलन करते समय, डीएलएल फ़ाइल को bin फ़ोल्डर में शामिल किया गया था। लेकिन MSBuild का उपयोग करते समय संकलित करते समय तृतीय-पक्ष DLL फ़ाइल शामिल नहीं थी।

अधिक निराश। जिस तरह से मैंने इसे हल किया था, वह मेरे वेब प्रोजेक्ट में पैकेज के NuGet संदर्भ को शामिल करना था, भले ही मैं इसे सीधे उपयोग नहीं कर रहा हूं।


घातक योजना का उपयोग करना,

वाई => एक्स => ए => बी ,

मेरी समस्या तब थी जब मैंने वाई बनाया, एक्स से असेंबली (ए और बी, उनमें से सभी 15) वाई के बिन फ़ोल्डर में दिखाई नहीं दे रहे थे।

मैंने वाई से संदर्भ एक्स को हटाकर, सहेजने, निर्माण करने, फिर एक्स संदर्भ (एक प्रोजेक्ट संदर्भ) दोबारा जोड़ने, और सहेजने, निर्माण करने और ए और बी को वाई के बिन फ़ोल्डर में दिखाना शुरू कर दिया।


वेबसाइट प्रोजेक्ट में आपके प्रोजेक्ट्रेरेंस से सभी संदर्भित डीएलएल फाइलों को शामिल करना हमेशा एक अच्छा विचार नहीं है, खासकर जब आप निर्भरता इंजेक्शन का उपयोग कर रहे हैं: आपका वेब प्रोजेक्ट सिर्फ इंटरफ़ेस डीएलएल फ़ाइल / प्रोजेक्ट में संदर्भ जोड़ना चाहता है, न कि कोई ठोस कार्यान्वयन डीएलएल फ़ाइल।

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







project