কীভাবে ভিজ্যুয়াল স্টুডিও একটি ডিএলএল ফাইলকে আউটপুট ডিরেক্টরিতে অনুলিপি করবেন?


101

আমার কাছে একটি ভিজ্যুয়াল স্টুডিও সি ++ প্রকল্প রয়েছে যা একটি বাহ্যিক ডিএলএল ফাইলের উপর নির্ভর করে। আমি যখন প্রকল্পটি তৈরি করব তখন কীভাবে আমি ভিজুয়াল স্টুডিও এই ডিএলএল ফাইলটিকে আউটপুট ডিরেক্টরিতে (ডিবাগ / রিলিজ) অনুলিপি করতে পারি?

উত্তর:


90

আপনার প্রকল্পে একটি বিল্ড-পরবর্তী ক্রিয়া ব্যবহার করুন এবং আপত্তিজনক ডিএলএল অনুলিপি করার জন্য আদেশগুলি যুক্ত করুন। পোস্ট-বিল্ড অ্যাকশনটি ব্যাচের স্ক্রিপ্ট হিসাবে লেখা হয়।

আউটপুট ডিরেক্টরি হিসাবে উল্লেখ করা যেতে পারে $(OutDir)। প্রকল্প ডিরেক্টরি হিসাবে উপলব্ধ $(ProjDir)। প্রযোজ্য ক্ষেত্রে আপেক্ষিক প্যাথগুলি ব্যবহার করার চেষ্টা করুন, যাতে আপনি পোস্ট-বিল্ড অ্যাকশনটি না ভেঙে আপনার প্রকল্প ফোল্ডারটি অনুলিপি করতে বা সরাতে পারেন।


25
এটি প্রোজেক্ট> প্রোপার্টি> বিল্ড ইভেন্টস> পোস্ট বিল্ড ইভেন্টের মাধ্যমে পোস্ট-বিল্ড ইভেন্টটি সেট করতে পারে তাও উল্লেখ করার মতো বিষয়।
ফিল বুথ


36
যদি লিংক কি কখনো বিরতি: "xcopy / y পর্যন্ত" $ (ProjectDir) * Dll "" $ (OutDir) "।
টেক্কা

আমি আমার উদাহরণগুলিতে ব্যক্তিগতভাবে কমান্ডটি কীভাবে ব্যবহার করি তার উপরে আমি উপরে পরিবর্তন করেছি। এটা হবে; উত্স নিয়ন্ত্রণের সাথে ভাল এমন পঠনযোগ্য ফাইলগুলি অনুলিপি করুন এবং লক্ষ্য ডিরেক্টরি তৈরি করে (সাধারণত প্রয়োজন হয় না)। -> xcopy "$ (প্রজেক্টডির) *। dll" "$ (আউটডির)" / i / r / y
খাওয়া

8
আউটপুট ডিরেক্টরিতে পরিবর্তন হয়নি এমন ফাইলগুলির অপ্রয়োজনীয় পুনরায় কপি আটকাতে xCopy এ / ডি পতাকা যুক্ত করুন।
জোয়

43

Out (আউটডির) ভিএস ২০১৩-তে একটি আপেক্ষিক পথ হিসাবে দেখা গেছে, সুতরাং কাঙ্ক্ষিত প্রভাব অর্জনের জন্য আমাকে এটিকে $ (প্রজেক্টডির) সাথে একত্রিত করতে হয়েছিল:

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

বিটিডাব্লু, আপনি সহজেই শুরুতে 'প্রতিধ্বনি' যোগ করে স্ক্রিপ্টগুলি ডিবাগ করতে পারেন এবং বিল্ড আউটপুট উইন্ডোতে প্রসারিত পাঠ্য পর্যবেক্ষণ করতে পারেন।


3
Tar (টার্গেটডির) $ (প্রজেক্টডির) replace (আউটডির) প্রতিস্থাপন করতে পারে কারণ এটি যাইহোক উভয়ের সংমিশ্রণ।
27

আমার ক্ষেত্রে / ডি ব্যতীত এটি একটি অ্যাক্সেস অস্বীকৃত ত্রুটি ছুড়েছিল। ডকুমেন্টেশন অনুসারে তবে / ডি তারিখের জন্য। সংযোগটি কী তা নিশ্চিত নয়।
রবি সি

1
/ ডি যোগ করা উত্স ফাইলটি পুরানো বা বিদ্যমান ফাইলের সমান হলে ওভাররাইটিং প্রতিরোধ করে। লক্ষ্যটি অন্য কোনও প্রক্রিয়া দ্বারা লক করা থাকলে অ্যাক্সেস অস্বীকার ত্রুটি ঘটতে পারে।
ধনী শীলারের

7

একই সমাধানের মধ্যে অন্য সি # প্রকল্পের রিলিজ এবং ডিবাগ ফোল্ডারে একটি সি ++ প্রকল্প থেকে আউটপুট dll অনুলিপি করার চেষ্টা করার সময় উপরের মন্তব্য বিভাগে বিশদটি আমার জন্য কার্যকর হয়নি (ভিএস 2013) for

আমাকে নিম্নলিখিত পোস্ট বিল্ড-অ্যাকশন যুক্ত করতে হয়েছিল (প্রজেক্টে ডান ক্লিক করুন যার একটি .dll আউটপুট রয়েছে) তারপরে বৈশিষ্ট্য -> কনফিগারেশন বৈশিষ্ট্য -> বিল্ড ইভেন্ট -> বিল্ড পরবর্তী ইভেন্ট -> কমান্ড লাইন

এখন আমি দুটি ফোল্ডারে আউটপুট dll অনুলিপি করতে এই দুটি লাইন যুক্ত করেছি:

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

5

(এই উত্তরটি কেবল সি # তে প্রযোজ্য নয় সি ++, দুঃখিত আমি মূল প্রশ্নটি ভুলভাবে লিখেছি)

আমি এর আগে ডিএলএল নরকের মধ্যে দিয়েছি। আমার চূড়ান্ত সমাধানটি হ'ল পরিচালিত ডিএলএল-তে নিয়ন্ত্রিত ডিএলএলগুলিকে বাইনারি সংস্থান হিসাবে সংরক্ষণ করা এবং প্রোগ্রাম চালু হওয়ার সাথে সাথে একটি অস্থায়ী ফোল্ডারে সরিয়ে ফেলা এবং যখন তা নিষ্পত্তি হয় তখন এগুলি মুছে ফেলা হয়।

এটি । নেট বা পিনভোক ইনফ্রাস্ট্রাক্টের অংশ হওয়া উচিত , যেহেতু এটি এত দরকারী managed এটি আপনার পরিচালিত ডিএলএলকে এক্সকপি ব্যবহার করে বা একটি বৃহত্তর ভিজ্যুয়াল স্টুডিও সমাধানে প্রকল্প রেফারেন্স হিসাবে পরিচালনা করা সহজ করে তোলে। একবার আপনি এটি করার পরে, আপনাকে পোস্ট-বিল্ড ইভেন্টগুলি নিয়ে চিন্তা করতে হবে না।

হালনাগাদ:

আমি এখানে অন্য উত্তরে কোড পোস্ট করেছি https://stackoverflow.com/a/11038376/364818


1
আমি সম্মত, এটি কাঠামোর একটি অংশ হওয়া উচিত (স্থিরভাবে dlls ইত্যাদি লিঙ্ক করা) - লক্ষণীয় নয়, একটি উত্স হিসাবে dll সংরক্ষণ করা এবং তারপরে রানটাইম এ বের করা কিছু কর্পোরেট পরিবেশে সমস্যা সৃষ্টি করতে পারে (বিশেষত যদি তাদের মোটামুটি থাকে) প্র্যাকটিভ অ্যান্টি-ভাইরাস সফ্টওয়্যার)।
BrainSlugs83

1

প্রোজেক্ট.কম্পোজ ফাইলটিতে বিল্টিন কপি যুক্ত করুন:

  <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)"

আপনি কোনও আপেক্ষিক পথটিও উল্লেখ করতে পারেন, পরবর্তী উদাহরণটি প্রকল্প ফোল্ডারের উপরে এক স্তর অবস্থিত একটি ফোল্ডারে ডিএলএল আবিষ্কার করবে। আপনার যদি একাধিক প্রকল্প রয়েছে যা একটি একক সমাধানে ডিএলএল ব্যবহার করে, আপনি যখন কোনওটিকে স্টার্টআপ প্রকল্প হিসাবে সেট করেন তখন এটি সাধারণ অঞ্চলে ডিএলএলটির উত্স স্থাপন করে 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)এক ধাপে আউটপুট ডিরেক্টরি সরবরাহ করবে।

মাইক্রোসফ্ট ভিজুয়াল স্টুডিওর বর্তমান এবং পূর্ববর্তী সংস্করণগুলির জন্য এমএসবিল্ড ম্যাক্রোগুলির তালিকা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.