जवाबों:
अपनी परियोजना में एक पोस्ट-बिल्ड एक्शन का उपयोग करें, और आक्रामक DLL की प्रतिलिपि बनाने के लिए कमांड जोड़ें। पोस्ट-बिल्ड एक्शन को एक बैच स्क्रिप्ट के रूप में लिखा जाता है।
आउटपुट डायरेक्टरी को संदर्भित किया जा सकता है $(OutDir)
। परियोजना निर्देशिका के रूप में उपलब्ध है $(ProjDir)
। जहां लागू हो, वहां सापेक्ष पथों का उपयोग करने का प्रयास करें, ताकि आप पोस्ट-बिल्ड एक्शन को तोड़े बिना अपने प्रोजेक्ट फ़ोल्डर को कॉपी या स्थानांतरित कर सकें।
$ (OutDir) VS2013 में एक सापेक्ष पथ निकला, इसलिए मुझे वांछित प्रभाव को प्राप्त करने के लिए इसे $ (ProjectDir) के साथ जोड़ना पड़ा:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
BTW, आप शुरुआत में आसानी से 'इको' जोड़कर स्क्रिप्ट को डीबग कर सकते हैं और बिल्ड आउटपुट विंडो में विस्तारित टेक्स्ट का निरीक्षण कर सकते हैं।
ऊपर टिप्पणी अनुभाग में विवरण मेरे (वीएस 2013) के लिए काम नहीं किया, जब एक ही समाधान के भीतर एक और सी # परियोजना के रिलीज और डीबग फ़ोल्डर में आउटपुट को एक सी ++ प्रोजेक्ट से कॉपी करने की कोशिश की गई।
मुझे निम्नलिखित पोस्ट बिल्ड-एक्शन (उस प्रोजेक्ट पर राइट क्लिक करना होगा जिसमें एक dd आउटपुट है) को फिर से जोड़ा गया है - गुण -> कॉन्फ़िगरेशन गुण -> बिल्ड ईवेंट -> पोस्ट-बिल्ड इवेंट -> कमांड लाइन
अब मैंने इन दो पंक्तियों को दो फ़ोल्डरों में आउटपुट dll की प्रतिलिपि बनाने के लिए जोड़ा:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(यह उत्तर केवल C # नहीं C ++ पर लागू होता है, क्षमा करें, मुझे मूल प्रश्न गलत लगा है)
मैं इस तरह से पहले DLL नरक के माध्यम से मिल गया है। मेरा अंतिम समाधान प्रबंधित DLL में अप्रबंधित DLL को बाइनरी संसाधनों के रूप में संग्रहीत करना था, और जब प्रोग्राम लॉन्च हो जाता है और इसे निपटाया जाता है, तो उन्हें एक अस्थायी फ़ोल्डर में निकालते हैं।
यह .NET या पिनवोक इन्फ्रास्ट्रक्चर का हिस्सा होना चाहिए , क्योंकि यह बहुत उपयोगी है .... यह आपके प्रबंधित DLL को Xcopy या बड़े Visual Studio समाधान में प्रोजेक्ट संदर्भ के रूप में प्रबंधित करने में आसान बनाता है। एक बार जब आप ऐसा कर लेते हैं, तो आपको पोस्ट-बिल्ड ईवेंट्स के बारे में चिंता करने की ज़रूरत नहीं है।
अपडेट करें:
मैंने एक और उत्तर https://stackoverflow.com/a/11038376/364818 पर यहां कोड डाला
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>
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 मैक्रोज़ की सूची