با سلام
من تعدادی فایل و فولدر مربوط به ابزار GeckoFX رو تو پوشه ی Debug ریختم که تو برنامم ازش استفاده میکنم
حالا میخوام ببینم میشه بجای پوشه ی debug از یک فولدر دیگه بخونم ؟
ممنون میشم پاسخ بدید
با سلام
من تعدادی فایل و فولدر مربوط به ابزار GeckoFX رو تو پوشه ی Debug ریختم که تو برنامم ازش استفاده میکنم
حالا میخوام ببینم میشه بجای پوشه ی debug از یک فولدر دیگه بخونم ؟
ممنون میشم پاسخ بدید
با سلام
برای اینکه بتونی تو سی شارپ از یک پوشه دیگر اسمبلی ها رو لود کنی یکی از راه حلها این است که بیای و رویداد AssemblyResolve رو خودت بنویسی.
مثلا :
var otherFolderDlls = new DirectoryInfo(companyFolder).GetFiles("*.dll");
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var dll = otherFolderDlls.FirstOrDefault(fi => fi.Name == args.Name);
if (dll == null)
{
return null;
}
return Assembly.LoadFrom(dll.FullName);
};
توجه داشته باشید که با توجه به نوع کوئری که من نوشتم برای لیست کردن اسمبلی ها سربار زیادی برای برنامه خواهد داشت.
در ضمن می توانید یک دیکشنری هم از اسامی و اسمبلی هایی که قبلاً لود کرده اید داشته باشید که ابتدا در آن جست و جو نمایید اگر یافت نشد اقدام به بارگزاری اسمبلی و قراردادن در دیکشنری و نهایتا بازگرداندن اسمبلی لود شده نمایید.
نکته مهم دیگر استفاده از Assembly.LoadFrom هست که اگر از Assembly.Load استفاده نمایید فقط باعث ایجاد لوپ بین دیزالور و لودر خواهد شد.
برای اینکه کامل با مبحث آشنا بشی می توانی از سورس های SharpDevelop کمک بگیری که بسیار عالی کار شده.
مگه میشه برنامه بدون رفرنس کردن لود کرد؟
کلاس هاش شناسایی نمیشه در این صورت.
بله میشه.مثلاً می خواهید یک ساختار برای پلاگین نوشتن ایجاد کنید تو یک اسمبلی مرجع کاری که می کنی یک کلاس پایه تعریف می کنی و رفرنس می کنی اینطوری از امکانات کلاس پایه استفاده می کنید.زمانی که پلاگینها رو نوشتید به صورت library در یک پوشه دیگر قرار می دهید و با تابع assembly.load اقدام به بارگیری انها می کنید. به راحتی با استفاده از وراثت می توانید از امکانات اضافه شده به برنامه استفاده نمایید.
اما فکر کنم این دوست ما هدفش اینه که در هنگام اجرا فقط فایل اجرایی در پوشه ای که کاربر به ان دسترسی دارد قرار بگیرد و الباقی ملحقات در مکانی دیگر باشد.
کلا کاربردهای زیادی داره اما برای پروژه های بزرگ که می شه با تکنیک هایی هزینه نگهداری و گسترش و ... رو کاهش داد.
می توانید در زیر هم روشهای کار و هم توضیحات تکمیلی رو بخونید
https://msdn.microsoft.com/en-us/library/ms173101.aspx
دوست عزیز ممنون از پاسخ شما
راستش من متوجه نشدم که چی شد
من الان فقط میدونم که یک پوشه حاوی کلی فایل و فولدر دارم که باید در زمان اجرای برنامه تو پوشه ی Debug باشه
حالا من میخوام جهت نظم دادن به پوشه و عدم تداخل فایل هام همه ی اونارو بریزم تو یک پوشه و اون پوشه را initialize کنم
ممنون میشم کمک کنید
با توجه به اینکه فقط می خواهید نظم بدهید راه حل زیر منطقی خواهد بود :
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
لینک منبع