博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#开发之反射的简单使用
阅读量:4882 次
发布时间:2019-06-11

本文共 2412 字,大约阅读时间需要 8 分钟。

原文

以前在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(" 装载出错 !");          }      }    }

 

转载于:https://www.cnblogs.com/arxive/p/6126212.html

你可能感兴趣的文章
动态规划LeetCode174地下城游戏
查看>>
Sublime Text 报“Pylinter could not automatically determined the path to lint.py
查看>>
自动化测试用例getText()获取某一个元素的值返回null或空
查看>>
大数智能未来
查看>>
virtualenv和virtualenvwrapper 的安装和使用
查看>>
MAC sublime text 无法自动补齐标签
查看>>
NgBook留言本开发全过程(1)
查看>>
LeetCode-指针法
查看>>
Mysql phpStudy升级Mysql版本,流产了怎么办?
查看>>
SQLServer之数据库行锁
查看>>
OFDM仿真
查看>>
浅谈linux内核中内存分配函数
查看>>
写在读研初期
查看>>
开环增益对负反馈放大电路的影响
查看>>
MySQL-ERROR 2003
查看>>
SQL Server2012-SSIS的包管理和部署
查看>>
JavaScript内置对象
查看>>
如何把js的循环写成异步的
查看>>
ER图是啥?
查看>>
too many include files depth = 1024错误原因
查看>>