在程序开发中,经常需要调用到外部的DLL,所以需要反射技术,动态的加载程序集,方便调用.
例如我们创建一个这样的类:
Code
namespace User
{
public class ShowName
{
public ShowName()
: this("")
{ }
public ShowName(string Name)
{
name = Name;
}
public string Name
{
get { return name; }
set { name = value; }
}
private string name;
public void ShowMe()
{
Console.WriteLine("I'm " + name);
}
public static int Main()
{
Console.WriteLine("location in User");
return 0;
}
}
}
在一般情况下,我们只需要在代码中这样调用就可以:
Code
public class Program
{
static void Main(string[] args)
{
ShowName sn = new ShowName("Alex");
sn.ShowMe();
Console.ReadLine();
}
}
如果需要在程序运行时动态加载,就需要用到Assembly类来实现,注意:(把上面的第一段代码,生成一个叫User.Dll)
一、Assembly.Load
这个方法接受一个AssemblyName实例作为一个参数,返回对应的程序集,实现的方法如下:
Code
public class Program
{
static void Main(string[] args)
{
Assembly a = Assembly.Load("User");
Type t = a.GetType("User.ShowName");
foreach (MethodInfo mf in t.GetMethods())
{
Console.WriteLine(mf.Name); //输出User.dll里面的所有方法
}
object user = a.CreateInstance(t.FullName);
object[] name = new object[1]; //新建一个数组,把参数传进去
name[0] = "Alex";
MethodInfo setname = t.GetMethod("set_Name"); //这个set_Name就是Name的set方法
setname.Invoke(user, name); //这里把name参数传进去
MethodInfo show = t.GetMethod("ShowMe");
show.Invoke(user, null);
Console.ReadLine();
}
}
这里输出的结果为:
get_Name
set_Name
ShowMe
Main
ToString
Equals
GetHashCode
GetType
I'm Alex
二、Assembly.LoadForm方法
该方法根据程序集的文件名与路径来加载程序集。
三、Assembly.LoadWithPartialName方法
该方法使用部分名称从应用程序目录或从全局程序集缓存加载程序集。
当然还要他们还可以实现部分引用,也就是可以通过程序集的名称,版本,公钥等等,只要在后面加上
Assembly a = Assembly.Load("User,version=1.0.0.0")来控制就可以了