MSBuild समाधान में परियोजना निर्भरता का उपयोग करते हुए संदर्भ (DLL फ़ाइलों) की प्रतिलिपि नहीं करता है


273

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

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

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

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

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

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

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

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

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

मैंने पहले ही सुनिश्चित कर लिया है कि MyBaseProject के .csproj में "true" मान के साथ निजी तत्व है (जो कि Visual Studio में " स्थानीय प्रतिलिपि बनाएँ " के लिए एक उपनाम होना चाहिए ):

<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 में प्रकट नहीं हुआ था, हालांकि विज़ुअल स्टूडियो ने कहा कि "स्थानीय कॉपी करें" सच। मैंने "लोकल कॉपी" को झूठा - सहेजा - और इसे फिर से सच पर वापस सेट कर दिया - सेव!)

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

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


11
मुझे ऐसा करने के लिए एक स्पष्ट उत्तर प्राप्त करना अच्छा लगेगा।
डेविड फेइवर


1
पूर्ण स्रोत कोड नमूने के साथ कोई अंतिम समाधान इसके बारे में काम कर रहा है?
किकेनेट

2
उत्तर देखें stackoverflow.com/a/21055664/21579 @deadlydog से नीचे। उत्कृष्ट स्पष्टीकरण और मेरे लिए इस मुद्दे को हल कर दिया ... नीचे दिया गया सबसे अधिक मतदान का जवाब VS2012 के लिए सही नहीं है।
जेफ विडमर

2
इसे कनेक्ट
Zack

जवाबों:


153

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

व्याख्या

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

तो निर्भरता श्रृंखला इस तरह दिखती है: Y => X => A => B

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

उपाय

इस समस्या को हल करने के लिए आपके पास दो विकल्प हैं, जिसके परिणामस्वरूप असेंबली बी को Y की बिन निर्देशिका को प्रोजेक्ट करने के लिए कॉपी किया जाएगा:

  1. प्रोजेक्ट Y में असेंबली B का संदर्भ जोड़ें।
  2. असेंबली B का उपयोग करने वाले प्रोजेक्ट X में फ़ाइल में डमी कोड जोड़ें

व्यक्तिगत रूप से मैं कुछ कारणों से विकल्प 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);
    }

4
यहाँ जो चर्चा नहीं की जा रही है वह यह है कि किसी वेब प्रोजेक्ट के बिल्ड उत्पादों की प्रतिलिपि बनाने और लक्ष्य आउटपुट निर्देशिका (जैसे / बिन / x86 / डीबग) की नियमित प्रतिलिपि बनाने में अंतर होता है। पूर्व संदर्भित परियोजना द्वारा किया जाता है जब यह बनाता है और बाद में निर्भर वेब परियोजना द्वारा किया जाता है। Microsoft.Common.targets की जाँच करना इसे समझने में मदद करता है। वेब / बिन की प्रतियां प्रतिलिपि स्थानीय व्यवहार पर बिल्कुल भी निर्भर नहीं करती हैं - प्रतिलिपि पर स्थानीय प्रभावों को आउटपुट लक्ष्य डीआईआर पर निर्भर करती हैं जो कि डिबग के माध्यम से चलने वाले कैसिनी द्वारा संदर्भित संरचना का हिस्सा नहीं है।
user1164178

6
क्या आप बता सकते हैं कि इसने "डमी कोड" को जोड़ने के बिना वीएस के साथ काम क्यों किया, लेकिन एमएसबिल्ट के साथ नहीं?
टोकन

3
किसी फ़ंक्शन को लागू करने से भी कम आक्रामक, आप विधानसभा के अंदर एक वर्ग के प्रकार को एक डमी चर में असाइन कर सकते हैं। Type dummyType = typeof(AssemblyA.AnyClass);
अरथमोनिएक

14
समाधान # 2 जैसा कि ऊपर दिखाया गया है, तब तक काम करेगा जब तक कि आपके पास Visual Studio में 'ऑप्टिमाइज़ कोड' सेटिंग की जाँच न हो जाए। उस स्थिति में, यह अभी भी dll को बाहर करेगा। मैंने इसकी "अनुकूलन" को ओवरराइड करने के लिए एक और पंक्ति जोड़ी। Console.WriteLine(dummyType.FullName);
जेसन

3
समाधान 2 ने मेरे लिए विजुअल स्टूडियो 2017 में काम नहीं किया। मैंने पहले सोचा था कि यह इसलिए था, क्योंकि मेरी असेंबली एक्स में, मैं केवल enumबी का उपयोग कर रहा था और मैंने मान लिया कि एनम इनलाइन हो रहा था। मैंने B से सीधे एक प्रकार का उपयोग करने के लिए कोड जोड़ा और इससे कोई मदद नहीं मिली। यह भी हमेशा ऐसा होता रहा है कि मेरा एक्स ए में एक प्रकार का उपयोग करता है जो कि बी में उपवर्ग प्रकार का होता है इसलिए मैं थाह नहीं लगा सकता कि कंपाइलर कैसे सोचता है कि बी को एक्स की आवश्यकता नहीं है और इसे अनदेखा किया जा सकता है। यह बोनर्स है।
Xharlie

170

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

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

और बस।

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


10
यह एक देवता था। इसके लिए शुक्रिया!
रेबेका

22
MSBuild 4 / VS2012 के साथ मेरे लिए काम नहीं किया। यही है, मैं कहने के लिए संदर्भों को अपडेट करने में सक्षम था <Private>true</Private>लेकिन ऐसा लगता था कि MSBuild पर इसका कोई प्रभाव नहीं था। अंत में, मैंने सिर्फ न्यूगेट के संदर्भों को डाउनलेवल परियोजनाओं में जोड़ा।
माइकल टेपर

2
मेरे लिए काम नहीं किया। यह अभी भी बिन फ़ोल्डर में System.Net.Http.Formatting की नकल नहीं करता है।
अकीरा यमामोटो

4
इस के बराबर है Have you tried turning it off and on again?, और यह काम किया!
गनोम

6
ऐसा लगता है कि VS2015 अभी भी वैसा ही व्यवहार करता है: 'कॉपी लोकल' को 'गलत' पर सेट करना और फिर संदर्भित '.dll' पर 'ट्रू', काम करता है।
फ्लिप करें

38

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

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


3
आउटपुट निर्देशिका टिप्पणी में आपकी प्रतिलिपि के लिए +1, यदि एल्माह कोड में उपयोग नहीं किया जा रहा है, तो सामग्री के रूप में प्रतिलिपि बनाने के लिए समझ में आता है।
किट रोद जूल

4
वास्तव में यह उन विधानसभाओं को नजरअंदाज करता है जिनका उपयोग नहीं किया जाता है, लेकिन ध्यान दें कि एक प्रमुख बात, वीएस 2010 के रूप में एक्सएएमएल संसाधन शब्दकोशों में असेंबली का उपयोग करके वीएसएम द्वारा एसेंबल का उपयोग करने के रूप में नहीं माना जाता है, इसलिए यह इसे कॉपी नहीं करेगा।
एलेक्स बर्टसेव


यह एक यूनिट टेस्ट प्रोजेक्ट के लिए बेहतर है जहां मुझे dll की आवश्यकता है। मैं एक dll जोड़ना नहीं चाहता कि परीक्षण चलाने के लिए मुख्य परियोजना की आवश्यकता नहीं है!
लूकोस

14

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

यह MSBuild फोरम थ्रेड मैंने शुरू किया

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

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


1
लानत है - यह एकमात्र समाधान है जो मैं भी आया था - आशा है कि इसे करने का एक बेहतर तरीका हो सकता है!
निकस्पून

2
एक कम हैसी समाधान (कोई अपराध नहीं!) के लिए नीचे andrew की
पुनरावृत्ति देखें

1
अब इसे देखने वालों के लिए, MSDN पर टोकन का जवाब अनिवार्य रूप से डेडलॉग के उत्तर के समान है , बशर्ते कुछ साल बाद।
jpaugh

8

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

जांचें कि क्या आपके प्रोजेक्ट का फ्रेमवर्क संस्करण dll के फ्रेमवर्क संस्करण के समान है जिसे आपने संदर्भ में रखा है।

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


6

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

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

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

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

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


मेरे पास एक ही मुद्दा था / t: का उपयोग करके संपूर्ण समाधान का निर्माण करना, एक चरण में टीमकैविटी से फिर अगले / t: WebAPP प्रोजेक्ट पर पैकेज। किसी भी परियोजना संदर्भ द्वारा संदर्भित किसी भी dlls शामिल नहीं थे। यह ऊपर - / T: पुनर्निर्माण का उपयोग करके तय किया गया था; WebAPI पर पैकेज तो उन dlls शामिल थे।
एंडी हॉयल

5

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

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


4

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

तो बस विधानसभा में एक वर्ग / घटक के लिए एक डमी संदर्भ को कुछ कोड में नए-आईएनजी के पीछे पर्याप्त रूप से MSBuild समझा गया था कि विधानसभा वास्तव में उपयोग में थी।


यह वास्तव में मेरा मुद्दा था और समाधान जो काम किया। बहुत लंबे समय से यह जानने की कोशिश कर रहे थे। धन्यवाद स्कॉट और @Alex Burstev
करोल

अच्छा दु: ख, यह मुझे पागल कर रहा था। हां , मैं FontAwesome.WPF का उपयोग कर रहा था, और केवल XAML (स्पष्ट कारणों के लिए) के भीतर से। डमी विधि जोड़ने से मदद मिली। धन्यवाद! और हाँ, वीएस 2017 15.6 अभी भी प्रभावित है, इसलिए मैंने एक बग दायर किया: github.com/dotnet/roslyn/issues/25349
सॉरेन कुक्लाउ

3

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

तो आपके उदाहरण में: MyWebProject1 पर लक्ष्य फ्रेमवर्क को .NET फ्रेमवर्क 4 पर सेट करें


3

डेडलॉग योजना का उपयोग करना,

Y => X => A => B ,

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

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


कई घंटों की खोज और कई अन्य समाधानों की कोशिश करने के बाद, यह मेरे लिए काम करता है।
सनकैट २२

2

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


2

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

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


2

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

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


2

एक अन्य परिदृश्य जहां यह दिखाता है कि क्या आप Visual Studio में पुराने "वेब साइट" प्रोजेक्ट प्रकार का उपयोग कर रहे हैं। उस प्रोजेक्ट प्रकार के लिए, यह .dll को संदर्भित करने में असमर्थ है जो इसके स्वयं के निर्देशिका संरचना (वर्तमान फ़ोल्डर और नीचे) से बाहर है। तो ऊपर दिए गए उत्तर में, मान लीजिए कि आपकी निर्देशिका संरचना इस तरह दिखती है:

यहां छवि विवरण दर्ज करें

जहां ProjectX और ProjectY माता-पिता / बच्चे की निर्देशिकाएं हैं, और ProjectX संदर्भ A.dll हैं जो बदले में B.dll का संदर्भ देते हैं, और B.dll निर्देशिका संरचना के बाहर है, जैसे रूट (पैकेज) पर एक Nuget पैकेज में, फिर A. dll को शामिल किया जाएगा, लेकिन B.dll नहीं होगा।


0

आज मेरे पास एक समान मुद्दा था, और यह निश्चित रूप से आपके प्रश्न का उत्तर नहीं है। लेकिन मैं सभी को सूचित करना चाहता हूं, और संभवतः अंतर्दृष्टि की एक चिंगारी प्रदान करता हूं।

मेरे पास ASP.NET एप्लिकेशन है। निर्माण प्रक्रिया को साफ करने और फिर बनाने के लिए सेट किया गया है।

मेरे पास दो जेनकिंस CI स्क्रिप्ट हैं। एक उत्पादन के लिए और एक मंचन के लिए। मैंने अपने आवेदन को मंचन के लिए तैनात किया और सब कुछ ठीक रहा। उत्पादन के लिए तैनात किया गया था और एक DLL फ़ाइल अनुपलब्ध थी जिसे संदर्भित किया गया था। यह DLL फ़ाइल प्रोजेक्ट के मूल में थी। किसी भी NuGet रिपॉजिटरी में नहीं। DLL को सेट किया गया था do not copy

CI स्क्रिप्ट और एप्लिकेशन दोनों परिनियोजन के बीच समान था। स्टेजिंग वातावरण में स्वच्छ और तैनात होने के बाद भी DLL फ़ाइल को ASP.NET एप्लिकेशन ( bin/) के नियोजन स्थान में बदल दिया गया था । यह उत्पादन वातावरण के मामले में नहीं था।

यह एक परीक्षण शाखा में पता चला है कि मैंने इस DLL फ़ाइल को binनिर्देशिका में कॉपी करने के लिए निर्माण प्रक्रिया में एक कदम जोड़ा था । अब उस हिस्से को जानने में थोड़ा समय लगा। सीआई प्रक्रिया खुद सफाई नहीं कर रही थी। DLL को कार्य निर्देशिका में छोड़ दिया गया था और गलती से ASP.NET .zip फ़ाइल के साथ पैक किया जा रहा था। उत्पादन शाखा के पास कभी भी उसी तरह से डीएलएल फ़ाइल की प्रतिलिपि नहीं थी और कभी भी गलती से इसे तैनात नहीं किया गया था।

TLDR; जाँच करें और सुनिश्चित करें कि आप जानते हैं कि आपका बिल्ड सर्वर क्या कर रहा है।


0

सुनिश्चित करें कि दोनों परियोजनाएं समान हैं। नेट संस्करण भी स्थानीय संपत्ति की प्रतिलिपि की जांच करते हैं लेकिन यह trueडिफ़ॉल्ट रूप से होना चाहिए


0

अतिरिक्त पैरामीटर जोड़कर Visual Studio 2015 का उपयोग करना

/ Deployonbuild = false

msbuild कमांड लाइन ने समस्या को ठीक किया।


-1

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

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


यह शीर्ष उत्तर का एक डुप्लिकेट है।
जाइल्स रॉबर्ट्स

-3

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

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

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