PDA

View Full Version : اجرای dll بدون add کردن



limpizik
یک شنبه 16 فروردین 1394, 03:11 صبح
سلام دوستان.
من قصدم اینه بدون add کردن فایل dll بتونم از فانکشن هاش استفاده کنم.با سرچی ک زدم یه چیزایی دستگیرم شد اما نتونستم اجرا کنم.
ابتدا یه فایل dll ایجاد میکنم به این شکل(لطفا به نام فانکشن و کلاس دقت کنید) :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace class1
{
public class class1
{
public static void func(string str) {
MessageBox.Show(str);
}
}
}


بعد یه پروژه Windows Form Application ایجاد میکنم و این فانکشن ها رو درش میسازم :
(class1 و func)

public static void Run(byte[] dll_byte, object[] dll_obj, string Class, string adress)
{
Assembly byteassem = Assembly.Load(dll_byte);
MethodInfo method_Run = byteassem.GetType(Class).GetMethod(adress);
method_Run.Invoke(null, dll_obj);
}
//////////////////////////////////
public static void Load_Dll(string str)
{
byte[] dll_path = File.ReadAllBytes("MyDllFile.dll");
Run(dll_path, new object[] { str }, "class1", "func");
}


و بعد یه جا با این فراخوانیش میکنم :

Load_Dll("Peigham");

و در نهایت کد کامپایل میشه اما در هنگام اجرا با خطا مواجه میشه.
ممنون میشم کمک کنید

SabaSabouhi
یک شنبه 16 فروردین 1394, 08:35 صبح
سلام دوستان.
من قصدم اینه بدون add کردن فایل dll بتونم از فانکشن هاش استفاده کنم.با سرچی ک زدم یه چیزایی دستگیرم شد اما نتونستم اجرا کنم.
ابتدا یه فایل dll ایجاد میکنم به این شکل(لطفا به نام فانکشن و کلاس دقت کنید) :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace class1
{
public class class1
{
public static void func(string str) {
MessageBox.Show(str);
}
}
}


بعد یه پروژه Windows Form Application ایجاد میکنم و این فانکشن ها رو درش میسازم :
(class1 و func)

public static void Run(byte[] dll_byte, object[] dll_obj, string Class, string adress)
{
Assembly byteassem = Assembly.Load(dll_byte);
MethodInfo method_Run = byteassem.GetType(Class).GetMethod(adress);
method_Run.Invoke(null, dll_obj);
}
//////////////////////////////////
public static void Load_Dll(string str)
{
byte[] dll_path = File.ReadAllBytes("MyDllFile.dll");
Run(dll_path, new object[] { str }, "class1", "func");
}


و بعد یه جا با این فراخوانیش میکنم :

Load_Dll("Peigham");

و در نهایت کد کامپایل میشه اما در هنگام اجرا با خطا مواجه میشه.
ممنون میشم کمک کنید

سلام
اول باید اسمبلی رو بارگزاری کنی:


var assembly = Assembly.LoadFrom( assemblyFile );

سپس باید از کلاسی که مد نظرت هست instance بسازی:



var type = assembly.GetType( typeName );
var instance = Activator.CreateInstance( type, nameSpace ) as MyClass;

به همین راحتی.
البته یه نکته‌ی مهم هم وجود داره. اون هم اینه که کلاس MyClass باید هم تو برنامه‌ی اصلی و هم در dll شما وجود داشته باشه. و این امکان نداره مگه این که یه dll دیگه‌ای وجود داشته باشه
که هم جزو resourceهای برنامه‌ی اصلی باشه و هم dll ای که به صورت پویا داره بارگزاری می‌شه.
البته معمولاً تو این موارد بجای کلاس از interface استفاده می‌شه.

صبا صبوحی