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




.net visual-studio-2010 (12)

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

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


मैंने पाया कि यदि प्रोजेक्टएक्स ने abc.dll का संदर्भ दिया है लेकिन abc.dll में परिभाषित किसी भी प्रकार का सीधे उपयोग नहीं किया है, तो abc.dll को मुख्य आउटपुट फ़ोल्डर में कॉपी नहीं किया जाएगा। (इसे अतिरिक्त उलझन में लाने के लिए प्रोजेक्टएक्स आउटपुट फ़ोल्डर में कॉपी किया जाएगा।)

इसलिए, यदि आप ProjectX में कहीं भी abc.dll से किसी भी प्रकार का उपयोग नहीं कर रहे हैं, तो ProjectX में फ़ाइलों में से किसी एक में एक डमी घोषणा डालें।

AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied

आपको प्रत्येक वर्ग के लिए ऐसा करने की आवश्यकता नहीं है - केवल एक बार डीएलएल प्रतिलिपि बनाने के लिए पर्याप्त होगा और सबकुछ अपेक्षित काम करेगा।

अनुपूरक: ध्यान दें कि यह डीबग मोड के लिए काम कर सकता है, लेकिन रिलीज के लिए नहीं। विवरण के लिए @ nvirth का जवाब देखें।


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

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


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

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

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

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

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

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


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

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

कोड में डमी के लिए कोई ज़रूरत नहीं है
बस:

निष्पादन योग्य परियोजना में एक संदर्भ जोड़ें

या / और सुनिश्चित करें कि निष्पादन योग्य प्रोजेक्ट में संदर्भ "Copy Local" सेट को TRUE (जो मेरी " गलती " थी) ऐसा लगता है कि यह मूल संदर्भित लाइब्रेरी-प्रोजेक्ट में सेटिंग को "ओवरराइट" करता है ...


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

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


ज़ोरग के जवाब ओवरलैर्ड के लिए बस एक 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);
    }
}

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


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

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


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

[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))]

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


सुनिश्चित करें कि आपके द्वारा उपयोग किए जाने वाले आश्रित डीएलएल के पास आपके प्रोजेक्ट के एप्लिकेशन के लक्ष्य। नेट फ्रेमवर्क से अधिक लक्ष्य नेटनेट फ्रेमवर्क नहीं है।

आप अपनी प्रोजेक्ट चुनकर इसे देख सकते हैं, फिर ALT + ENTER दबाएं, फिर बाईं ओर से एप्लिकेशन का चयन करें और फिर अपनी प्रोजेक्ट के लक्ष्य फ्रेमवर्क का चयन करें।

मान लीजिए, निर्भर डीएल लक्ष्य फ्रेमवर्क = 4.0 और एप्लिकेशन डीएल लक्ष्य फ्रेमवर्क = 3.5 फिर इसे 4.0 में बदलें

धन्यवाद!


एक मौजूदा आइटम के रूप में डीएलएल को परियोजनाओं में से एक में जोड़ें और इसे सॉर्ट किया जाना चाहिए





reference