PDA

View Full Version : سوال: فراخوانی متدهای یک Dll



barnamenevisjma
سه شنبه 07 دی 1389, 00:56 صبح
چطوری میشه در زمان اجرای برنامه، یه متد رو از یه Dll فراخونی کرد؟(مسیر این DLL رو داریم و
حالا میخواهیم متد خاصی را که در DLL وجود دارد، فراخونی کنیم. این DLL یه نسخه جدید از اسمبلی فعلی نیست. بلکه یه کار جدید را انجام خواهد داد.)
تا اونجایی که من فهمیدم، این مسئله مربوط میشه به Reflectionها. یه سری مطالب رو در مورد این بحث مطالعه کردم، ولی متاسفانه جوابی که می خواستم رو بدست نیاوردم.
اگه یه مثال بزنید، واقعا ممنون میشم.
با تشکر
امیدوارم این سوال من رو مثل چند سوال دیگه ام ( که در همین تالار مطرح کردم ) بی جواب نذارین.

Reza_Yarahmadi
سه شنبه 07 دی 1389, 08:30 صبح
در صورت دونستن نام كلاس ، نام متد و پارامترهاي وروديش ميتونيد بصورت زير اين كار رو انجام بديد


using System.Reflection;

void InvokeMethod(String Path, String className, String MethodName, object[] Params)
{
Assembly ass = Assembly.LoadFile(Path);
object obj = ass.CreateInstance(className);
obj.GetType().GetMethod(MethodName).Invoke(obj, Params);
}

بصورت زير هم ميشه ازش استفاده كرد

InvokeMethod(@"FullPath\Sample_1.exe", "Sample_1.Form1", "btnSample1_Click", new object[] { null, null });

barnamenevisjma
سه شنبه 07 دی 1389, 08:53 صبح
سپاسگذارم.
خوب، حالا میشه یه جوری این Objectی که ساخته میشه رو یه بلایی سرش آورد، تا بتونیم مستقیما با "." به اعضای داخلیش (متد- فیلد- prooerty و ...) دسترسی
داشته باشیم؟
برای فراخونی سازنده، باید چیکار کرد؟

Reza_Yarahmadi
سه شنبه 07 دی 1389, 11:26 صبح
با Reflection نميشه همچين كاري كرد.
در صورتي كه كلاسهايي كه ميخوايد اين كار رو باهاش انجام بديد داراي متدهاي مشابه اي هستند ميتونيد كلاسها رو از يك Interface مشترك ارث ببريد و توي هر كدوم متدها رو پياده سازي كنيد‌ ، زمان صدا كردن هم آبجكت رو به Interface تبديل كنيد و متد مورد نظر رو صدا بزنيد

public interface IInterface
{
void Method1();
}


public class class1 : IInterface
{
public void Method1()
{
MessageBox.Show("Called in Class1");
}
}

public class class2 : IInterface
{
public void Method1()
{
MessageBox.Show("Called in Class2");
}
}
توي برنامه هم متدي مثل متد زير بنويسيد

void InvokeMthod(IInterface obj, object[] Params)
{
obj.Method1();
}
مثالي از نحوه فراخواني متد

InvokeMthod(new class2(), new object[] { });