c# - নির্ভরশীল DLL ভিজ্যুয়াল স্টুডিওতে বিল্ড আউটপুট ফোল্ডারে অনুলিপি করা হচ্ছে না




.net visual-studio-2010 (11)

আউটপুট ডিরেক্টরিগুলিতে প্রয়োজনীয় লাইব্রেরি কপি করার জন্য আমি পোস্টbuild ইভেন্টগুলিতে এটি যোগ করব। XCopy pathtolibraries টার্গেট ডাইরেক্টরি মত কিছু

আপনি প্রকল্প বৈশিষ্ট্য তাদের খুঁজে পেতে পারেন -> ইভেন্ট তৈরি করুন।

আমি একটি চাক্ষুষ স্টুডিও সমাধান আছে। আমি সমাধান অনেক প্রকল্প আছে। একটি প্রধান প্রকল্প যা শুরু হয় এবং অন্যান্য প্রকল্পগুলি ব্যবহার করে। একটি প্রকল্প "ProjectX" বলে আছে। এর রেফারেন্স প্রধান প্রকল্প যোগ করা হয়। ProjectX আরেকটি .NET ডিল (abc.dll বলুন) উল্লেখ করে যা সমাধানটির অংশ নয়।

এখন এই abc.dll মূল প্রকল্পের বিন / ডিবাগ ফোল্ডারে অনুলিপি করা উচিত, তবে এটি অনুলিপি করা হচ্ছে না। কেন এটি অনুলিপি হচ্ছে না, কোন পরিচিত কারণ?


আপনার দ্বারা ব্যবহৃত নির্ভরশীল ডিলটি আপনার প্রকল্পের প্রয়োগের টার্গেট। নেট ফ্রেমওয়ার্কের চেয়ে বেশি .net ফ্রেমওয়ার্ক লক্ষ্য করে না।

আপনি আপনার প্রকল্পটি নির্বাচন করে এটি পরীক্ষা করতে পারেন, তারপরে ALT + ENTER টিপুন, তারপরে বাম দিক থেকে অ্যাপ্লিকেশনটি নির্বাচন করুন এবং তারপরে আপনার প্রকল্পের লক্ষ্য ফ্রেমওয়ার্ক নির্বাচন করুন।

ধরুন, নির্ভরশীল ডিল টার্গেট ফ্রেমওয়ার্ক = 4.0 এবং অ্যাপ্লিকেশন ডিল টার্গেট ফ্রেমওয়ার্ক = 3.5 তারপর এটি 4.0 তে পরিবর্তন করুন

ধন্যবাদ!


আপনি এটি একটি সমাবেশ বৈশিষ্ট্য করতে যখন এটি চটকা দেখায়

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

আপনি যদি রেফারেন্সযুক্ত সমাবেশটি ডান দিকে ক্লিক করেন, আপনি কপির স্থানীয় নামক একটি সম্পত্তি দেখতে পাবেন। কপি স্থানীয় সত্য সেট করা হয়, তারপর সমাবেশ বিন অন্তর্ভুক্ত করা উচিত। যাইহোক , ভিসুয়াল স্টুডিওতে সমস্যা হতে পারে, এটি কখনও কখনও বিন ফোল্ডারে রেফারেন্সড ডিল অন্তর্ভুক্ত করে না ... এটি আমার জন্য কাজ করে এমন কার্যকারিতা:


আমার ক্ষেত্রে, এটি ছিল মূঢ় জিনিস যা টিএফএস / ভিএসের ডিফল্ট আচরণের কারণে আমি অসম্মতি প্রকাশ করি।

প্রধান প্রকল্পের একটি রেফারেন্স হিসাবে ডিল যোগ করার পর থেকে, আমি এটি "বিদ্যমান আইটেম" হিসাবে কপি স্থানীয় = সর্বদা সহ যুক্ত করার সিদ্ধান্ত নিয়েছি। এমনকি তারপর ফাইল ছিল না।

VS সমাধান এবং স্থানীয়ভাবে এবং সার্ভারে উভয় সংকলিত থাকা সত্ত্বেও ফাইলটি উপস্থিত থাকলেও, VS / TFS প্রকৃতপক্ষে সোর্স নিয়ন্ত্রণে ফাইল যুক্ত করে না। এটি "মুলতুবি পরিবর্তন" এ অন্তর্ভুক্ত ছিল না। আমি নিজে সোর্স কন্ট্রোল এক্সপ্লোরারে গিয়েছিলাম এবং স্পষ্টভাবে "ফোল্ডারে আইটেম যুক্ত করুন" আইকনের উপর ক্লিক করেছিলাম।

মূঢ় কারণ আমি ভিএস 15 বছর ধরে উন্নয়নশীল হয়েছে। আমি আগে এটিতে গিয়েছি, আমি মনে রাখি নি এবং যেভাবেই আমি এটি মিস করেছি কারণ ফাইলটি নিয়মিত রেফারেন্সের কারণে এখনও সংকলিত হয়েছে, তবে বিদ্যমান আইটেম হিসাবে যোগ করা ফাইলটি অনুলিপি করা হচ্ছে না কারণ এটিতে বিদ্যমান নেই উৎস নিয়ন্ত্রণ সার্ভার।

আমি আশা করি এটি কেউকে কিছু সময় বাঁচাবে, কারণ আমি আমার জীবনের 2 দিন হারিয়েছি।


আমি দেখেছি যে যদি প্রজেক্টএক্স abc.dll উল্লেখ করে তবে abc.dll তে নির্ধারিত কোনও প্রকারের সরাসরি ব্যবহার করে না, তবে abc.dll প্রধান আউটপুট ফোল্ডারে অনুলিপি করা হবে না। (এটি অতিরিক্ত বিভ্রান্তিকর করার জন্য ProjectX আউটপুট ফোল্ডারে অনুলিপি করা হবে।)

সুতরাং, যদি আপনি প্রজেক্টএক্সে যেকোনো জায়গায় abc.dll থেকে স্পষ্টভাবে কোনও প্রকার ব্যবহার করেন না তবে ProjectX- এ কোনও ফাইলের মধ্যে ডামি ঘোষণাটি কোথাও রাখুন।

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

প্রতিটি ক্লাসের জন্য আপনাকে এটি করতে হবে না - একবার একবার DLL অনুলিপি তৈরি করতে এবং সবকিছু প্রত্যাশিত হিসাবে কাজ করবে।

সংযোজন: মনে রাখবেন যে এটি ডিবাগ মোডের জন্য কাজ করতে পারে তবে মুক্তির জন্য নয়। বিস্তারিত জানার জন্য @ nvirth এর উত্তর দেখুন।


এই nvirth এর উদাহরণ উপর একটি সামান্য tweak হয়

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

এই একই সমস্যা মধ্যে রান। পটভূমি তথ্য: বিল্ডিংয়ের আগে, আমি সমাধানের জন্য একটি নতুন প্রকল্প এক্স যুক্ত করেছি। প্রকল্প Y প্রকল্প এবং প্রকল্প এ, বি, সি প্রকল্প Y উপর নির্ভরশীল।

ত্রুটি তৈরি করুন যে প্রকল্প A, B, C, Y, এবং X dlls পাওয়া যায় নি।

রুট কারণটি হ'ল নতুন তৈরি করা প্রকল্প এক্স লক্ষ্যমাত্রা .নেট 4.5। বাকি সমাধান প্রকল্পগুলি লক্ষ্য করে .নেট 4.5.1। প্রকল্প এক্স তৈরি করে না বাকি প্রকল্পগুলি তৈরি করতে পারে না।

নিশ্চিত করুন যে কোনও নতুন যোগ করা প্রকল্পগুলি বাকি সমাধান হিসাবে একই .NET সংস্করণটিকে লক্ষ্য করে।


নিশ্চিত না হলেও এটি আমার জন্য, অনেক বার আমি একটি DLL উল্লেখ করি (যা স্বয়ংক্রিয়ভাবে এটি অবশ্যই বিন ফোল্ডারে যোগ করে)। তবে যে DLL অতিরিক্ত DLL প্রয়োজন হতে পারে (আমি যে ফাংশনগুলি ব্যবহার করছি তার উপর নির্ভর করে)। আমি আমার প্রোজেক্টে সেগুলিকে উল্লেখ করতে চাই না কারণ আমি কেবলমাত্র সেই একই ফোল্ডারে শেষ করতে হবে যা আমি DLL হিসাবে ব্যবহার করছি।

আমি ভিসুয়াল স্টুডিওতে এটি "একটি বিদ্যমান ফাইল যুক্ত করে" সম্পন্ন করি। আপনি Add_data ফোল্ডার ব্যতীত যে কোন জায়গায় এটি যুক্ত করতে সক্ষম হবেন। ব্যক্তিগতভাবে আমি শুধু রুট এটি যোগ করুন।

তারপরে সেই ফাইলটির বৈশিষ্ট্যগুলি পরিবর্তন করুন ...

অ্যাকশন = কোনটি তৈরি করুন (কোনও সামগ্রীতে এই সেট থাকা সামগ্রীটি আসলে "রুট" সংস্করণটির মূলটিতে কপি করে এবং প্লাসটিতে একটি অনুলিপি)।

আউটপুট ফোল্ডারে অনুলিপি করুন = নতুন হলে অনুলিপি করুন (প্রকৃতপক্ষে এটি যদি অনুপস্থিত থাকে তবে এটি শুধুমাত্র বিআইএন ফোল্ডারে রাখে তবে এটির পরে এটি করে না)

যখন আমি প্রকাশ করি .. আমার যোগ করা DLL এর কেবলমাত্র বিIN ফোল্ডারে বিদ্যমান এবং প্রকাশের অবস্থানে অন্য কোথাও নেই (যা আমি চাই)।


শুধু ওভারলর্ড জার্গ এর উত্তর একটি 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" সেটটি TRUE (যা আমার " দোষ ") ছিল তা মনে হয় যে এই "ওভাররোট" বেসের লাইব্রেরী-প্রকল্পের ভিতর সেটিংটি "overwrote" মনে হচ্ছে ...








reference