c# - निर्भर स्टूडियो में निर्भर आउटपुट फ़ोल्डर में निर्भर डीएलएल की प्रतिलिपि नहीं बनाई जा रही है




.net visual-studio-2010 (10)

मेरे पास एक दृश्य स्टूडियो समाधान है। मेरे पास समाधान में कई परियोजनाएं हैं I एक मुख्य परियोजना है जो शुरूआत के रूप में कार्य करती है और अन्य परियोजनाओं का उपयोग करती है। एक प्रोजेक्ट "प्रोजेक्टएक्स" कहता है। इसका संदर्भ मुख्य परियोजना में जोड़ा गया है। प्रोजेक्टएक्स एक और .NET डीएल (abc.dll कहें) का संदर्भ देता है जो समाधान का हिस्सा नहीं है।

अब यह abc.dll मुख्य परियोजना के बिन / डीबग फ़ोल्डर में कॉपी किया जाना चाहिए, लेकिन यह वहां कॉपी नहीं हो रहा है। यह किसी भी ज्ञात कारणों की प्रतिलिपि क्यों नहीं मिल रही है?


आउटपुट निर्देशिकाओं में आवश्यक पुस्तकालयों की प्रतिलिपि बनाने के लिए मैं पोस्टबिल्ड घटनाओं में इसे जोड़ूंगा। XCopy pathtolibraries targetdirectory की तरह कुछ

आप उन्हें प्रोजेक्ट गुणों पर ढूंढ सकते हैं -> ईवेंट बनाएं।


आप एक ही फ़ोल्डर में मुख्य परियोजना और प्रोजेक्टएक्स के निर्माण आउटपुट पथ दोनों सेट कर सकते हैं, फिर आप उस फ़ोल्डर में आवश्यक सभी डीएलएस प्राप्त कर सकते हैं।


इस मुद्दे में भागो। पृष्ठभूमि की जानकारी: इमारत से पहले, मैंने समाधान के लिए एक नया प्रोजेक्ट एक्स जोड़ा था। परियोजना वाई परियोजना प्रोजेक्ट पर निर्भर परियोजना एक्स और परियोजना ए, बी, सी पर निर्भर है।

त्रुटियां बनाएं कि प्रोजेक्ट ए, बी, सी, वाई, और एक्स डीएलएस नहीं मिल सके।

मूल कारण यह था कि नव निर्मित प्रोजेक्ट एक्स ने .NET 4.5 को लक्षित किया जबकि बाकी समाधान परियोजनाओं ने .NET 4.5.1 को लक्षित किया। प्रोजेक्ट एक्स ने अन्य परियोजनाओं को बनाने के लिए निर्माण नहीं किया था।

सुनिश्चित करें कि कोई भी नया जोड़ा गया प्रोजेक्ट उसी .NET संस्करण को शेष समाधान के रूप में लक्षित करता है।


उपरोक्त आम लोगों के अलावा, मेरे पास प्रकाशित करने के लिए एक बहु-परियोजना समाधान था। स्पष्ट रूप से कुछ फाइलें विभिन्न ढांचे को लक्षित करती हैं।

तो मेरा समाधान: गुण> विशिष्ट संस्करण (झूठा)


जब आप इसे एक असेंबली विशेषता बनाते हैं तो यह धीमा दिखता है

[AttributeUsage(AttributeTargets.Assembly)]
public class ForceAssemblyReference: Attribute
{        
    public ForceAssemblyReference(Type forcedType)
    {
        //not sure if these two lines are required since 
        //the type is passed to constructor as parameter, 
        //thus effectively being used
        Action<Type> noop = _ => { };
        noop(forcedType);
    }
}

उपयोग होगा:

[assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]

ज़ोरग के जवाब ओवरलैर्ड के लिए बस एक sidenote।

मैंने इस तरह डमी संदर्भ जोड़ा है, और यह डीबग मोड में काम किया है:

public class DummyClass
{
    private static void Dummy()
    {
        var dummy = typeof(AbcDll.AnyClass);
    }
}

लेकिन रिलीज मोड में, आश्रित डीएल अभी भी कॉपी नहीं किया गया था।
हालांकि यह काम किया:

public class DummyClass
{
    private static void Dummy()
    {
        Action<Type> noop = _ => {};
        var dummy = typeof(AbcDll.AnyClass);
        noop(dummy);
    }
}

इस जानकारी ने वास्तव में मुझे पता लगाने के लिए घंटों का खर्च किया, इसलिए मैंने सोचा कि मैं इसे साझा करता हूं।


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


यह nvirth के उदाहरण पर थोड़ा सा चिमटा है

internal class DummyClass
{
    private static void Dummy()
    {
        Noop(typeof(AbcDll.AnyClass));
    }
    private static void Noop(Type _) { }
}

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

मैं विजुअल स्टूडियो में इसे "मौजूदा फाइल जोड़कर" पूरा करता हूं। आप Add_data फ़ोल्डर को छोड़कर कहीं भी इसे जोड़ने में सक्षम होना चाहिए। व्यक्तिगत रूप से मैं इसे रूट में जोड़ता हूं।

फिर उस फ़ाइल के गुणों को बदलें ...

एक्शन बनाएं = कोई नहीं (इस सेट को सामग्री की तरह कुछ करने के लिए वास्तव में रूट पर "मूल" संस्करण की प्रतिलिपि बनाते हैं, साथ ही बिन में एक प्रति)।

आउटपुट फ़ोल्डर में कॉपी करें = अगर नई हो तो कॉपी करें (मूल रूप से इसे केवल बीआईएन फ़ोल्डर में रखता है यदि यह गायब है, लेकिन उसके बाद ऐसा नहीं करता है)

जब मैं प्रकाशित करता हूं .. मेरा जोड़ा गया डीएलएल केवल बीआईएन फ़ोल्डर में मौजूद है और प्रकाशन स्थान में कहीं और नहीं है (जो मैं चाहता हूं)।


हां, आपको Copy Local को Copy Local करने की आवश्यकता होगी। हालांकि, मुझे पूरा यकीन है कि आपको मुख्य परियोजना से उस असेंबली को संदर्भित करने की आवश्यकता होगी और Copy Local को Copy Local true सेट Copy Local - यह केवल एक निर्भर असेंबली से कॉपी नहीं होता है।

References तहत असेंबली पर क्लिक करके और F4 दबाकर आप Copy Local संपत्ति की Copy Local प्राप्त कर सकते हैं।






reference