PDA

View Full Version : آیا امکان خواندن اسمبلی ها از یک پوشه دیگر به جای پوشه Debug وجود دارد ؟



@liReza11800
شنبه 11 مهر 1394, 11:32 صبح
با سلام
من تعدادی فایل و فولدر مربوط به ابزار GeckoFX رو تو پوشه ی Debug ریختم که تو برنامم ازش استفاده میکنم
حالا میخوام ببینم میشه بجای پوشه ی debug از یک فولدر دیگه بخونم ؟
ممنون میشم پاسخ بدید

Arman_1367
شنبه 11 مهر 1394, 13:27 عصر
با سلام
برای اینکه بتونی تو سی شارپ از یک پوشه دیگر اسمبلی ها رو لود کنی یکی از راه حلها این است که بیای و رویداد 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 کمک بگیری که بسیار عالی کار شده.

fakhravari
شنبه 11 مهر 1394, 13:59 عصر
مگه میشه برنامه بدون رفرنس کردن لود کرد؟
کلاس هاش شناسایی نمیشه در این صورت.

:متفکر:

Arman_1367
شنبه 11 مهر 1394, 14:11 عصر
مگه میشه برنامه بدون رفرنس کردن لود کرد؟
کلاس هاش شناسایی نمیشه در این صورت.

:متفکر:

بله میشه.مثلاً می خواهید یک ساختار برای پلاگین نوشتن ایجاد کنید تو یک اسمبلی مرجع کاری که می کنی یک کلاس پایه تعریف می کنی و رفرنس می کنی اینطوری از امکانات کلاس پایه استفاده می کنید.زمانی که پلاگینها رو نوشتید به صورت library در یک پوشه دیگر قرار می دهید و با تابع assembly.load اقدام به بارگیری انها می کنید. به راحتی با استفاده از وراثت می توانید از امکانات اضافه شده به برنامه استفاده نمایید.
اما فکر کنم این دوست ما هدفش اینه که در هنگام اجرا فقط فایل اجرایی در پوشه ای که کاربر به ان دسترسی دارد قرار بگیرد و الباقی ملحقات در مکانی دیگر باشد.
کلا کاربردهای زیادی داره اما برای پروژه های بزرگ که می شه با تکنیک هایی هزینه نگهداری و گسترش و ... رو کاهش داد.
می توانید در زیر هم روشهای کار و هم توضیحات تکمیلی رو بخونید
https://msdn.microsoft.com/en-us/library/ms173101.aspx

@liReza11800
شنبه 11 مهر 1394, 15:43 عصر
دوست عزیز ممنون از پاسخ شما
راستش من متوجه نشدم که چی شد

من الان فقط میدونم که یک پوشه حاوی کلی فایل و فولدر دارم که باید در زمان اجرای برنامه تو پوشه ی Debug باشه
حالا من میخوام جهت نظم دادن به پوشه و عدم تداخل فایل هام همه ی اونارو بریزم تو یک پوشه و اون پوشه را initialize کنم
ممنون میشم کمک کنید

Arman_1367
شنبه 11 مهر 1394, 18:44 عصر
با توجه به اینکه فقط می خواهید نظم بدهید راه حل زیر منطقی خواهد بود :

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
لینک منبع (https://msdn.microsoft.com/en-us/library/823z9h8w.aspx)