PDA

View Full Version : using در زمان اجرا



reza_Nazem
پنج شنبه 06 مرداد 1390, 22:30 عصر
با سلام
dll هایی که در using قرار میگیرند در هنگام کامپایل کنترل می شوند(در صورت نبود dll برنامه کامپایل نمی شود)
ایا امکانی است که به نحوی از یک dll استفاده کنیم که در هنگام اجرا کنترل شود ؟ (در صورت نبود dll در هنگام کامپایل error ندهد)

Esmail Solhkhah
پنج شنبه 06 مرداد 1390, 23:56 عصر
از این نمونه کد استفاده کنید

با این فرض نوشتم که dll یا dll های مورد نظر رو تو فولدر system32 ویندوز کپی کردید.


using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication4
{
static class Program
{

[STAThread]
static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandler);

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}

public static Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
{
Assembly MyAssembly, objExecutingAssemblies;
string strTempAssmbPath = "";

objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
{

if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
{
strTempAssmbPath = Environment.SystemDirectory + "\\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
break;
}
}
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

return MyAssembly;
}
}
}


موفق باشید.

far2020
جمعه 07 مرداد 1390, 01:49 صبح
فرض کن یه Dll داری که توش یه namespace بنام Usedbyreflection داریم و توی اون یه کلاس هست به اسم class1.تو این کلاس یه متدی داریم به اسم show().به این شکل:



namespace Usedbyreflection
{
public class Class1
{
public void show()
{
Console.WriteLine("InvokedByRflectPower!");
}
}
}


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



using System;
using System.Reflection;

namespace Reflection
{
class Program
{
static void Main(string[] args)
{
try
{
//Dll لود کردن
Assembly AS = Assembly.LoadFile(@"C:\Users\Silverman\Documents\visual studio 2010\Projects\WindowsFormsApplication1\Usedbyrefle ction\bin\Release\Usedbyreflection.dll");
//Class1 گرفتن نوع کلاس
Type t = AS.GetType("Usedbyreflection.Class1");
//Class1 از کلاس instance ایجاد یه
object o = Activator.CreateInstance(t);
//show() فراخوانی متد
t.InvokeMember("show",BindingFlags.InvokeMethod, null,o,null);

}
catch
{
Console.WriteLine("Error");
}
Console.ReadLine();
}
}
}