Visual Studio को DLL फ़ाइल की आउटपुट निर्देशिका में कॉपी कैसे करें?


101

मेरे पास Visual Studio C ++ प्रोजेक्ट है जो बाहरी DLL फ़ाइल पर निर्भर करता है। जब मैं प्रोजेक्ट का निर्माण करता हूं तो मैं इस DLL फाइल को आउटपुट डायरेक्टरी (डिबग / रिलीज) में कैसे कॉपी कर सकता हूं?

जवाबों:


90

अपनी परियोजना में एक पोस्ट-बिल्ड एक्शन का उपयोग करें, और आक्रामक DLL की प्रतिलिपि बनाने के लिए कमांड जोड़ें। पोस्ट-बिल्ड एक्शन को एक बैच स्क्रिप्ट के रूप में लिखा जाता है।

आउटपुट डायरेक्टरी को संदर्भित किया जा सकता है $(OutDir)। परियोजना निर्देशिका के रूप में उपलब्ध है $(ProjDir)। जहां लागू हो, वहां सापेक्ष पथों का उपयोग करने का प्रयास करें, ताकि आप पोस्ट-बिल्ड एक्शन को तोड़े बिना अपने प्रोजेक्ट फ़ोल्डर को कॉपी या स्थानांतरित कर सकें।


25
यह इंगित करने के लायक भी है कि वह प्रोजेक्ट> गुण> बिल्ड इवेंट> पोस्ट-बिल्ड इवेंट के माध्यम से पोस्ट-बिल्ड इवेंट सेट कर सकता है।
फिल बूथ


36
मामले में कभी भी लिंक टूट जाता है: "xcopy / y" $ (ProjectDir) *। Dll "" $ (OutDir) "
इक्के

मैंने उपरोक्त को बदल दिया कि मैं व्यक्तिगत रूप से अपने उदाहरणों में कमांड का उपयोग कैसे करूं। यह करेगा; कॉपी-ओनली फाइलें जो स्रोत नियंत्रण के साथ अच्छी हैं, और लक्ष्य निर्देशिका (सामान्य रूप से आवश्यक नहीं) बनाती है। -> xcopy "$ (ProjectDir) *। dll" "$ (OutDir)" / i / r / y
Joes

8
आउटपुट निर्देशिका में परिवर्तित नहीं हुई फ़ाइलों की अनावश्यक पुनरावृत्ति को रोकने के लिए xCopy में / d ध्वज जोड़ें।
ज़ोइ

43

$ (OutDir) VS2013 में एक सापेक्ष पथ निकला, इसलिए मुझे वांछित प्रभाव को प्राप्त करने के लिए इसे $ (ProjectDir) के साथ जोड़ना पड़ा:

xcopy /y /d  "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"

BTW, आप शुरुआत में आसानी से 'इको' जोड़कर स्क्रिप्ट को डीबग कर सकते हैं और बिल्ड आउटपुट विंडो में विस्तारित टेक्स्ट का निरीक्षण कर सकते हैं।


3
$ (TargetDir) $ (ProjectDir) $ (OutDir) को प्रतिस्थापित कर सकता है क्योंकि यह दोनों का संयोजन है।
person27

मेरे मामले में / d के बिना यह एक्सेस अस्वीकृत त्रुटि फेंक रहा था। लेकिन / घ के अनुसार प्रलेखन तिथि के लिए है। निश्चित नहीं है कि कनेक्शन क्या है।
रवि सी।

1
यदि स्रोत फ़ाइल पुरानी है या मौजूदा फ़ाइल के समान है, तो / d को जोड़ना अधिलेखित होने से रोकता है। यदि लक्ष्य किसी अन्य प्रक्रिया द्वारा लॉक किया गया है, तो पहुँच अस्वीकृत त्रुटि हो सकती है।
रिच शीलर

7

ऊपर टिप्पणी अनुभाग में विवरण मेरे (वीएस 2013) के लिए काम नहीं किया, जब एक ही समाधान के भीतर एक और सी # परियोजना के रिलीज और डीबग फ़ोल्डर में आउटपुट को एक सी ++ प्रोजेक्ट से कॉपी करने की कोशिश की गई।

मुझे निम्नलिखित पोस्ट बिल्ड-एक्शन (उस प्रोजेक्ट पर राइट क्लिक करना होगा जिसमें एक dd आउटपुट है) को फिर से जोड़ा गया है - गुण -> कॉन्फ़िगरेशन गुण -> बिल्ड ईवेंट -> पोस्ट-बिल्ड इवेंट -> कमांड लाइन

अब मैंने इन दो पंक्तियों को दो फ़ोल्डरों में आउटपुट dll की प्रतिलिपि बनाने के लिए जोड़ा:

xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug

5

(यह उत्तर केवल C # नहीं C ++ पर लागू होता है, क्षमा करें, मुझे मूल प्रश्न गलत लगा है)

मैं इस तरह से पहले DLL नरक के माध्यम से मिल गया है। मेरा अंतिम समाधान प्रबंधित DLL में अप्रबंधित DLL को बाइनरी संसाधनों के रूप में संग्रहीत करना था, और जब प्रोग्राम लॉन्च हो जाता है और इसे निपटाया जाता है, तो उन्हें एक अस्थायी फ़ोल्डर में निकालते हैं।

यह .NET या पिनवोक इन्फ्रास्ट्रक्चर का हिस्सा होना चाहिए , क्योंकि यह बहुत उपयोगी है .... यह आपके प्रबंधित DLL को Xcopy या बड़े Visual Studio समाधान में प्रोजेक्ट संदर्भ के रूप में प्रबंधित करने में आसान बनाता है। एक बार जब आप ऐसा कर लेते हैं, तो आपको पोस्ट-बिल्ड ईवेंट्स के बारे में चिंता करने की ज़रूरत नहीं है।

अपडेट करें:

मैंने एक और उत्तर https://stackoverflow.com/a/11038376/364818 पर यहां कोड डाला


1
मैं मानता हूं, यह ढांचे का एक हिस्सा होना चाहिए (सांख्यिकीय रूप से लिंक dlls, आदि के लिए) - वर्थ नोटिंग, dll को संसाधन के रूप में संग्रहीत करना और फिर इसे रनटाइम पर निकालने से कुछ कॉर्पोरेट वातावरण में समस्याएँ उत्पन्न हो सकती हैं (विशेषकर यदि वे निष्पक्ष हों सक्रिय विरोधी वायरस सॉफ्टवेयर)।
BrainSlugs83

1

Project.csproj फ़ाइल में अंतर्निहित COPY जोड़ें :

  <Project>
    ...
    <Target Name="AfterBuild">
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Debug\bin" SkipUnchangedFiles="false" />
      <Copy SourceFiles="$(ProjectDir)..\..\Lib\*.dll" DestinationFolder="$(OutDir)Release\bin" SkipUnchangedFiles="false" />
    </Target>
  </Project>

वीएस के लिए एक दीर्घकालिक बग है,
समाधानडायर के

0
xcopy /y /d  "$(ProjectDir)External\*.dll" "$(TargetDir)"

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

xcopy /y /d  "$(ProjectDir)..\External\*.dll" "$(TargetDir)"

/yपुष्टि के बिना विकल्प प्रतियां। /dविकल्प जांच करता है कि एक फ़ाइल लक्ष्य में मौजूद है और अगर यह केवल प्रतियां करता स्रोत लक्ष्य की तुलना में एक नए टाइमस्टैम्प है या नहीं।

मैंने पाया कि विज़ुअल स्टूडियो के कम से कम नए संस्करणों में, जैसे वीएस 2109 $(ProjDir)अपरिभाषित है और $(ProjectDir)इसके बजाय इसका उपयोग करना था।

xcopyआउटपुट निर्देशिका में डिफ़ॉल्ट रूप से एक लक्ष्य फ़ोल्डर छोड़ना चाहिए। यह महत्वपूर्ण है कि $(OutDir)अकेले कारण को समझना मददगार नहीं है।

$(OutDir)कम से कम विज़ुअल स्टूडियो के हाल के संस्करणों में, आउटपुट फ़ोल्डर के सापेक्ष पथ के रूप में परिभाषित किया गया है bin/x86/Debug। लक्ष्य के रूप में अकेले इसका उपयोग करने से प्रोजेक्ट आउटपुट फ़ोल्डर से शुरू होने वाले फ़ोल्डरों का एक नया सेट तैयार होगा। उदाहरण के लिए: … bin/x86/Debug/bin/x86/Debug

इसे प्रोजेक्ट फ़ोल्डर के साथ मिलाकर आपको उचित स्थान पर पहुंचाना चाहिए। उदाहरण के लिए: $(ProjectDir)$(OutDir)

हालाँकि $(TargetDir)एक चरण में आउटपुट डायरेक्टरी प्रदान करेगा।

Visual Studio के वर्तमान और पिछले संस्करणों के लिए Microsoft MSBuild मैक्रोज़ की सूची

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