您的位置:首页 > 编程语言 > C#

C#开发之反射的简单使用

2016-12-02 16:18 288 查看
奋斗的蘑菇 原文C#开发之反射的简单使用

以前在Windows Mobile中写过一个写好的Dll中的图片的例子,现在在项目中有接触到在一个大的窗体中,动态的加载一些窗体这样的需求。将功能按照模块的划分进行单独开发成单独的Dll,主框架根据需要动态加载不同的Dll来加载不同的窗体来满足不同的需求。

1.以下是一个简单的例子,有一个按钮点击事件,点击事件实现加载已知的Dll中的窗体。

private void button1_Click(object sender, EventArgs e)
{

//点击加载DLL中的窗体Form4
string dllName = "ClassLibrary1.dll";
string formName = "ClassLibrary1.Form4";
Form ff = null;
//加载Dll
Assembly MyAssembly = Assembly.LoadFrom(dllName);
//获得Dll中的所有类、成员
Type[] types = MyAssembly.GetTypes();
Type type = null;
//遍历出需要的成员(窗体)
foreach(Type t in types) {
if(t.FullName == formName) {
type = t;
break;
}
}
//对窗体进行实例化
ff = (Form)Activator.CreateInstance(type);
ff.Show();
}


2.反射机制调用Dll中的方法

private void button1_Click(object sender, EventArgs e)
{

//点击加载DLL中的窗体Form4
string dllName = "ClassLibrary1.dll";
string formName = "ClassLibrary1.Form4";
Form ff = null;
//加载Dll
Assembly MyAssembly = Assembly.LoadFrom(dllName);
//获得Dll中的所有类、成员
Type[] types = MyAssembly.GetTypes();
Type type = null;
//遍历出需要的成员(窗体)
foreach(Type t in types) {
if(t.FullName == formName) {
type = t;
break;
}
}
//对窗体进行实例化
ff = (Form)Activator.CreateInstance(type);
ff.Show();
}

public string Add(int x, int y)
{  return x + y + "";  }

private void button2_Click(object sender, EventArgs e)
{

//加载Dll信息
string dllName = "ClassLibrary1.dll";
string dllNamespace="ClassLibrary1";
string className = "Class1";
string methodName = "Add";
//调用的方法参数
object[] parameters = new object[2] { 1, 2 };
string message = "";
//加载Dll信息
Assembly MyAssembly = Assembly.LoadFrom(dllName);
Type[] types = MyAssembly.GetTypes();
//遍历方法所在的类
foreach(Type t in types) {
if(t.Namespace == dllNamespace && t.Name == className) {
MethodInfo m = t.GetMethod(methodName);
if(m != null) {
//调用Dll中的方法
object o = Activator.CreateInstance(t);
message= m.Invoke(o, parameters).ToString();
MessageBox.Show(message);
} else
MessageBox.Show(" 装载出错 !");
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: