PDA

View Full Version : سوال: کار با Dll بعد از اجرای برنامه



barnamenevisjma
پنج شنبه 16 دی 1389, 01:10 صبح
سلام
برنامه ای دارم که در اون کاربر یه dll رو انتخاب میکنه. حالا من چطور میتونم معتبر بودن dll انتخاب شده رو چک کنم؟؟؟ (این Dll باید کلاسی داشته باشد به نام A که این کلاس باید یا مشتقی از کلاس X باشد و یا مثلا اینترفیس XX رو پیاده سازی کرده باشد )
آیا این کار نیاز به اطلاعات خاصی هم دارد؟ مثلا اسم کلاس، لازمه یا نیازی نیست؟

با تشکر.

abbas.oveissi
پنج شنبه 16 دی 1389, 14:38 عصر
کسی جواب نمیده ؟؟؟؟؟ کمک!!!

منظورت از معتبر بودن DLL چیه ؟؟؟ یعنی میخوای چک کنی ببینی کلاس خاصی توی DLL وجود داره یا نه؟؟؟

barnamenevisjma
پنج شنبه 16 دی 1389, 15:59 عصر
دقیقا. میخوام ببینم ایا کلاسی داره که مثلا از کلاس X مشتق شده باشه یا نه؟

abbas.oveissi
پنج شنبه 16 دی 1389, 17:06 عصر
برای فهمیدن اینکه کلاس از چه کلاسی مشتق شده از مثال زیر استفاده کن . مثلا ما کلاس های زیر رو داریم :


class oveissi
{

}

class abbas : oveissi
{

}


برای پیدا کردن کلاس پایه باید از کد زیر استفاده کنی :


abbas a = new abbas();
MessageBox.Show(a.GetType().BaseType.ToString());


خروجی این مثال که در messagebox نمایش داده میشه کلاس پایه "oveissi" هست .

پ.ن 1 : من فقط با ساختن شیء تونستم بفهمم کلاس پایه چیه
پ.ن 2 : یکم روی این ;using System.Reflection تحقیق کن.

mehdi.mousavi
پنج شنبه 16 دی 1389, 18:57 عصر
سلام برنامه ای دارم که در اون کاربر یه dll رو انتخاب میکنه. حالا من چطور میتونم معتبر بودن dll انتخاب شده رو چک کنم؟؟؟ (این Dll باید کلاسی داشته باشد به نام A که این کلاس باید یا مشتقی از کلاس X باشد و یا مثلا اینترفیس XX رو پیاده سازی کرده باشد ) آیا این کار نیاز به اطلاعات خاصی هم دارد؟ مثلا اسم کلاس، لازمه یا نیازی نیست؟ با تشکر.

سلام.
اگر درست متوجه شده باشم، هدف از اینکار نوشتن Plugin هستش. برای اینکار، شما باید کاربر رو به Implement کردن Interface خاصی در Assembly اش ترغیب کنید، بعد نگران این باشید که آیا Assembly تعیین شده توسط کاربر برای Load شدن مناسبه یا خیر. خوندن این مقاله (http://www.c-sharpcorner.com/uploadfile/rmcochran/plug_in_architecture09092007111353am/plug_in_architecture.aspx)بهتون یکی از روشهای ایجاد یک Pluggable Architecture بر اساس .NET رو نشون میده. در هر حال، اگر Public Key اون Assembly رو داشته باشید (و Version اش رو)، می تونید به این روش اونو بگیرید و با Public Key (و Version) مورد نظر مقایسه کنید (اگر چه، قبل از اینکه کد منو بخونید، لطفا مقاله مزبور رو به دقت مطالعه کنید).


AssemblyName assemblyName = AssemblyName.GetAssemblyName("d:\\whatever\\myassembly.dll");
byte[] key = assemblyName.GetPublicKey();
Version version = assemblyName.Version;

موفق باشید.

پاورقی:


دقیقا. میخوام ببینم ایا کلاسی داره که مثلا از کلاس X مشتق شده باشه یا نه؟
اونوقت از کجا معلوم که این اون X همون X ای باشه که مد نظر شماست؟ حتی فرض کنیم که Namespace اش هم یکی باشه، بازهم تضمینی وجود نداره که اون X همون X مورد نظر شما باشه.

barnamenevisjma
یک شنبه 19 دی 1389, 01:18 صبح
سلام



:افسرده::عصبانی++::عصبانی++::ع بانی++::عصبانی++::عصبانی++:



اونوقت از کجا معلوم که این اون X همون X ای باشه که مد نظر شماست؟ حتی فرض کنیم که Namespace اش هم یکی باشه، بازهم تضمینی وجود نداره که اون X همون X مورد نظر شما باشهبرای رفع این مشکل، تو همون مقاله یه راه حل پیشنهاد شده. حالا فرض کنیم DLL مناسبه. چطوری با متدها- سازنده و .. این Dll کار کنم.(فراخوانی- مقدار دادن یا گرفتن مقدارو خلاصه از اینجور کارا) راستش خیلی توی نت گشتم ولی متاسفانه مطلبی که مشکل من رو حل کنه، پیدا نکردم. تو همین سایت هم گشتم. ولی چیزی که میخوام رو پیدا نکردم.

با Reflector ها هم کار نکردم و کتاب شسته-رفته ای هم براش ندارم. لطفا به دادم برسید. یا لااقل یه کتاب درست حسابی معرفی کنید. (که کار با متد های تعریف شده در یه Dll رو توضیح داده باشه(Runtime). نه اینکه کلی از Reflectorها تعریف کنه و آخر سر هم بگه حالا برید خودتون بخونین!)
راستی یه سوال جا موند: آیا روش فراخوانی سازنده(ها) با فراخوانی سایر متدها یکسان است یا نه؟توضیح میدین؟

شدیدا به کمکتون نیاز دارم...
با تشکر.

barnamenevisjma
یک شنبه 19 دی 1389, 03:26 صبح
راستی میشه در مورد GetModule و GetMethod و .. توضیح بدین؟
ممنون.

mehdi.mousavi
دوشنبه 20 دی 1389, 14:40 عصر
[RIGHT]چطوری با متدها- سازنده و .. این Dll کار کنم.(فراخوانی- مقدار دادن یا گرفتن مقدارو خلاصه از اینجور کارا) راستش خیلی توی نت گشتم ولی متاسفانه مطلبی که مشکل من رو حل کنه، پیدا نکردم. تو همین سایت هم گشتم. ولی چیزی که میخوام رو پیدا نکردم.

سلام.
من قبلا در این مورد در چند تاپیک دیگه صحبت کرده بودم. یکی از اونها این تاپیک (http://barnamenevis.org/showthread.php?248824-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-Runtime-%DA%A9%D8%AF%D9%87%D8%A7) هستش.
لطفا پست های اون تاپیک رو بدقت بخونید، اگر بازهم سوالی بود مطرح کنید تا پاسخ بدم.

موفق باشید.

پاورقی: اگر از .NET 4.0 استفاده می کنید، میتونید از dynamic و DLR برای اینکار استفاده کنید که کدهای Boilerplate رو از بین میبره. در هر حال، لطفا تاپیک قبلی رو مطالعه کنید، سوالی بود بفرمایید تا پاسخ بدم.