উত্তর:
আপনার প্রকল্পে একটি বিল্ড-পরবর্তী ক্রিয়া ব্যবহার করুন এবং আপত্তিজনক ডিএলএল অনুলিপি করার জন্য আদেশগুলি যুক্ত করুন। পোস্ট-বিল্ড অ্যাকশনটি ব্যাচের স্ক্রিপ্ট হিসাবে লেখা হয়।
আউটপুট ডিরেক্টরি হিসাবে উল্লেখ করা যেতে পারে $(OutDir)
। প্রকল্প ডিরেক্টরি হিসাবে উপলব্ধ $(ProjDir)
। প্রযোজ্য ক্ষেত্রে আপেক্ষিক প্যাথগুলি ব্যবহার করার চেষ্টা করুন, যাতে আপনি পোস্ট-বিল্ড অ্যাকশনটি না ভেঙে আপনার প্রকল্প ফোল্ডারটি অনুলিপি করতে বা সরাতে পারেন।
Out (আউটডির) ভিএস ২০১৩-তে একটি আপেক্ষিক পথ হিসাবে দেখা গেছে, সুতরাং কাঙ্ক্ষিত প্রভাব অর্জনের জন্য আমাকে এটিকে $ (প্রজেক্টডির) সাথে একত্রিত করতে হয়েছিল:
xcopy /y /d "$(ProjectDir)External\*.dll" "$(ProjectDir)$(OutDir)"
বিটিডাব্লু, আপনি সহজেই শুরুতে 'প্রতিধ্বনি' যোগ করে স্ক্রিপ্টগুলি ডিবাগ করতে পারেন এবং বিল্ড আউটপুট উইন্ডোতে প্রসারিত পাঠ্য পর্যবেক্ষণ করতে পারেন।
একই সমাধানের মধ্যে অন্য সি # প্রকল্পের রিলিজ এবং ডিবাগ ফোল্ডারে একটি সি ++ প্রকল্প থেকে আউটপুট dll অনুলিপি করার চেষ্টা করার সময় উপরের মন্তব্য বিভাগে বিশদটি আমার জন্য কার্যকর হয়নি (ভিএস 2013) for
আমাকে নিম্নলিখিত পোস্ট বিল্ড-অ্যাকশন যুক্ত করতে হয়েছিল (প্রজেক্টে ডান ক্লিক করুন যার একটি .dll আউটপুট রয়েছে) তারপরে বৈশিষ্ট্য -> কনফিগারেশন বৈশিষ্ট্য -> বিল্ড ইভেন্ট -> বিল্ড পরবর্তী ইভেন্ট -> কমান্ড লাইন
এখন আমি দুটি ফোল্ডারে আউটপুট dll অনুলিপি করতে এই দুটি লাইন যুক্ত করেছি:
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Release
xcopy /y $(TargetPath) $(SolutionDir)aeiscontroller\bin\Debug
(এই উত্তরটি কেবল সি # তে প্রযোজ্য নয় সি ++, দুঃখিত আমি মূল প্রশ্নটি ভুলভাবে লিখেছি)
আমি এর আগে ডিএলএল নরকের মধ্যে দিয়েছি। আমার চূড়ান্ত সমাধানটি হ'ল পরিচালিত ডিএলএল-তে নিয়ন্ত্রিত ডিএলএলগুলিকে বাইনারি সংস্থান হিসাবে সংরক্ষণ করা এবং প্রোগ্রাম চালু হওয়ার সাথে সাথে একটি অস্থায়ী ফোল্ডারে সরিয়ে ফেলা এবং যখন তা নিষ্পত্তি হয় তখন এগুলি মুছে ফেলা হয়।
এটি । নেট বা পিনভোক ইনফ্রাস্ট্রাক্টের অংশ হওয়া উচিত , যেহেতু এটি এত দরকারী managed এটি আপনার পরিচালিত ডিএলএলকে এক্সকপি ব্যবহার করে বা একটি বৃহত্তর ভিজ্যুয়াল স্টুডিও সমাধানে প্রকল্প রেফারেন্স হিসাবে পরিচালনা করা সহজ করে তোলে। একবার আপনি এটি করার পরে, আপনাকে পোস্ট-বিল্ড ইভেন্টগুলি নিয়ে চিন্তা করতে হবে না।
হালনাগাদ:
আমি এখানে অন্য উত্তরে কোড পোস্ট করেছি https://stackoverflow.com/a/11038376/364818
প্রোজেক্ট.কম্পোজ ফাইলটিতে বিল্টিন কপি যুক্ত করুন:
<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)"
আপনি কোনও আপেক্ষিক পথটিও উল্লেখ করতে পারেন, পরবর্তী উদাহরণটি প্রকল্প ফোল্ডারের উপরে এক স্তর অবস্থিত একটি ফোল্ডারে ডিএলএল আবিষ্কার করবে। আপনার যদি একাধিক প্রকল্প রয়েছে যা একটি একক সমাধানে ডিএলএল ব্যবহার করে, আপনি যখন কোনওটিকে স্টার্টআপ প্রকল্প হিসাবে সেট করেন তখন এটি সাধারণ অঞ্চলে ডিএলএলটির উত্স স্থাপন করে places
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)
এক ধাপে আউটপুট ডিরেক্টরি সরবরাহ করবে।