今天中午吃饭,突然有同事谈到不知道程序集名是否也可以调用DLL的公开方法。当时哑了,好久没弄过反射,印象模糊了。回来试了一下,其实只要知道DLL的命名空间和要调用的方法的类名就可以调用该方法了(注:非同一命名空间下,该DLL的类和方法必须是公开的)。示例代码如下:
创建一个类库,名称为DemoLB,创建一个类Class1,写个公开方法Print(),该方法很简单,就是定义一个整数,然后输出它的类型。
代码
namespace DemoLB
{
public class Class1
{
public void Print()
{
int i = 42;
System.Type type = i.GetType();
Console.WriteLine(type);
}
}
}
{
public class Class1
{
public void Print()
{
int i = 42;
System.Type type = i.GetType();
Console.WriteLine(type);
}
}
}
将上面代码编译生成DemoLB.dll
创建CSharpReflection控制台项目,将DemoLB.dll拷贝到CSharpReflection项目的Bin目录,示例代码如下:
代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection; //引入反射命名空间
namespace CSharpReflection
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom("DemoLB.dll"); //动态创建程序集
object obj = Activator.CreateInstance(assembly.GetType("DemoLB.Class1")); //动态创建对象
DemoLB.Class1 demo = obj as DemoLB.Class1; //转换成Class1类
Console.WriteLine(assembly.GetName()); //输出程序集名称
demo.Print(); //调用DemoLB.dll的Print方法
Console.Read();
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Reflection; //引入反射命名空间
namespace CSharpReflection
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom("DemoLB.dll"); //动态创建程序集
object obj = Activator.CreateInstance(assembly.GetType("DemoLB.Class1")); //动态创建对象
DemoLB.Class1 demo = obj as DemoLB.Class1; //转换成Class1类
Console.WriteLine(assembly.GetName()); //输出程序集名称
demo.Print(); //调用DemoLB.dll的Print方法
Console.Read();
}
}
}
参考资料:http://msdn.microsoft.com/zh-cn/library/ms173183(VS.80).aspx
示例源代码:反射示例