PDA

View Full Version : ایجاد کلاس در زمان اجرا



mohsen_zelzela00
سه شنبه 28 خرداد 1392, 23:59 عصر
با عرض سلام خدمت اساتید محترم.

من می خواستم زمانی که برنامه در حال اجرا است و مثلاً روی یک دکمه کلیک کنم یک کلاس C# در یک مسیر خاص برای من ایجاد شود و یک دستور هم در کلاس خودم بنویسم

خیلی در اینترنت گشتم که چگونه یک کلاس در زمان اجرا ایجاد کنیم اما نتیجه نگرفتم ممنون میشم اساتید محترم راهنمایی کنند.

esafb52
چهارشنبه 29 خرداد 1392, 00:03 صبح
شما دوست عزیز کجا رو گشتین؟؟
http://www.bing.com/search?q=how+to+create+class+in+c%23+in+runtime&FORM=AWRE
خصوصا لینک استک اور فلو رو مطالعه کن
http://stackoverflow.com/questions/11305696/how-to-create-new-classes-on-runtime-c-sharp

ali_md110
چهارشنبه 29 خرداد 1392, 01:05 صبح
public DllCreator(double dbl1, double dbl2)
{


System.Reflection.AssemblyVersionAttribute ver = new System.Reflection.AssemblyVersionAttribute("1,0,0,0");
System.CodeDom.Compiler.CompilerParameters parameters = new System.CodeDom.Compiler.CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = "my.dll";

System.CodeDom.Compiler.CompilerResults r = System.CodeDom.Compiler.CodeDomProvider.CreateProv ider("C#").CompileAssemblyFromSource(parameters, "public class myClass { public static double code1 = " + dbl1 + ";public static double code2 = " + dbl2 + ";}");

Console.WriteLine(System.Reflection.Assembly.LoadF rom("my.dll").GetType("myClass").GetField("code1").GetValue(null));
Console.WriteLine(System.Reflection.Assembly.LoadF rom("my.dll").GetType("myClass").GetField("code2").GetValue(null));
}



این کلاس دو ارکومان داره که میتونی هنگام ساختن dll مقداری درونش ذخیره کنید
اگر این کلاس صدا بزنید

DllCreator dll= new DllCreator(1,2)
یک dll ساخته میشه بنام my.dll با دو فیلد استاتیک که دارای مقادیر 1و 2 هست


برای اینکه ببینی آیا داده ذخیره شده یا نه تابع زیر رو صدا بزنید و در پنجره OutPut مشاهده میکنید که تابع دارای فیلدهایی با مقادیر 1و2 میباشد
در ضمن my.dll در مسیر bin برنامه ساخته میشه

public static void GetLicense()
{
// Load the assembly
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(AppDomain.Curr entDomain.BaseDirectory + "my.dll");

// Get all of the types defined in the assembly
Type[] typesInAssembly = assembly.GetTypes();

foreach (Type type in typesInAssembly)
{
Console.WriteLine("Type: {0}", type);

// This loads the public fields
System.Reflection.FieldInfo[] fields = type.GetFields();


foreach (var field in fields)
{
// Console.WriteLine(" {0}", field.Name);
if (field.Name == "code1")
{
Console.WriteLine(field.GetValue(0));
}
if (field.Name == "code2")
{
Console.WriteLine(field.GetValue(1));
}
}


}
}

mohsen_zelzela00
چهارشنبه 29 خرداد 1392, 22:35 عصر
public DllCreator(double dbl1, double dbl2)
{


System.Reflection.AssemblyVersionAttribute ver = new System.Reflection.AssemblyVersionAttribute("1,0,0,0");
System.CodeDom.Compiler.CompilerParameters parameters = new System.CodeDom.Compiler.CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = "my.dll";

System.CodeDom.Compiler.CompilerResults r = System.CodeDom.Compiler.CodeDomProvider.CreateProv ider("C#").CompileAssemblyFromSource(parameters, "public class myClass { public static double code1 = " + dbl1 + ";public static double code2 = " + dbl2 + ";}");

Console.WriteLine(System.Reflection.Assembly.LoadF rom("my.dll").GetType("myClass").GetField("code1").GetValue(null));
Console.WriteLine(System.Reflection.Assembly.LoadF rom("my.dll").GetType("myClass").GetField("code2").GetValue(null));
}



این کلاس دو ارکومان داره که میتونی هنگام ساختن dll مقداری درونش ذخیره کنید
اگر این کلاس صدا بزنید

DllCreator dll= new DllCreator(1,2)
یک dll ساخته میشه بنام my.dll با دو فیلد استاتیک که دارای مقادیر 1و 2 هست


برای اینکه ببینی آیا داده ذخیره شده یا نه تابع زیر رو صدا بزنید و در پنجره OutPut مشاهده میکنید که تابع دارای فیلدهایی با مقادیر 1و2 میباشد
در ضمن my.dll در مسیر bin برنامه ساخته میشه

public static void GetLicense()
{
// Load the assembly
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(AppDomain.Curr entDomain.BaseDirectory + "my.dll");

// Get all of the types defined in the assembly
Type[] typesInAssembly = assembly.GetTypes();

foreach (Type type in typesInAssembly)
{
Console.WriteLine("Type: {0}", type);

// This loads the public fields
System.Reflection.FieldInfo[] fields = type.GetFields();


foreach (var field in fields)
{
// Console.WriteLine(" {0}", field.Name);
if (field.Name == "code1")
{
Console.WriteLine(field.GetValue(0));
}
if (field.Name == "code2")
{
Console.WriteLine(field.GetValue(1));
}
}


}
}
با تشکر از شما دوست عزیز، فقط یه مشکل و اونم اینه که زمانی که من این کد را اجرا می کنم یک dll برای من ایجاد می شود ، در صورتی که من می خواهم یه کلاس برای من ایجاد بشه چون دارم روی یک CodeGeneretor برای خودم کار می کنم. ممنون میشم راهنمایی کنید.