奋斗的蘑菇 原文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[] { , };
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(" 装载出错 !");
}
} }

C#开发之反射的简单使用的更多相关文章

  1. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  2. java反射(四)--反射与简单java类

    一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...

  3. Bootstrap 简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。

    Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单.

  4. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  5. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  6. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  7. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  8. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  9. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

随机推荐

  1. Python递归输出字典所有不同深度的路径

    应用场景 假设有这样一个字典结构test_dict = {'a':{'b':{'c':1}},'d':2},test_dict其实可以看作是一种树状结构,其中每个叶子节点深度不一定相同,如果我们希望输 ...

  2. redis使用入门

    redis使用 1. redis安装 sudo apt-get install redis-server 2. redis使用(以localhost为例) redis启动 redis-cli -h h ...

  3. HDU - 6214:Smallest Minimum Cut(最小割边最小割)

    Consider a network G=(V,E) G=(V,E) with source s s and sink t t . An s-t cut is a partition of nodes ...

  4. ubuntu16安装最新版docker

    ubuntu16.04安装最新版docker.docker-compose.docker-machine https://www.cnblogs.com/tianhei/p/7802064.html ...

  5. callback回调函数-python

    链接:http://www.zhihu.com/question/19801131/answer/27459821来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 编程分 ...

  6. gradle build scan 插件使用

    1. 添加插件 build.gradle plugins { id 'com.gradle.build-scan' version '1.10.2' } buildScan { // Uncommen ...

  7. 【转】如何将FLAC格式转为MP3格式

    原文网址:http://jingyan.baidu.com/ae/3aed632e65708470108091ca.html FLAC全称为无损音频压缩编码,FLAC格式又称无损格式 不会破坏原有的音 ...

  8. eclipse git 开发操作流程

    1.eclipse git 开发操作流程 1.1流程简介 1)master主分支,当开发版本得到了充分的验证之后,才能将分支合入master,master为可产品化发布的状态. 2)develop分支 ...

  9. windows环境vagrant修改静态资源文件,centos虚拟机中nginx的web环境下不生效

    最近上手krpano,本地修改了krpano.html文件或者xml文件,在虚拟机环境打开文件是修改过来了,在nginx中就是不生效. 修改nginx.conf中http{}中的 sendfile  ...

  10. Linux和Windows的遍历目录下所有文件的方法对比

    首先两者读取所有文件的方法都是采用迭代的方式,首先用函数A的返回值判断目录下是否有文件,然后返回值合法则在循环中用函数B直到函数B的返回值不合法为止.最后用函数C释放资源. 1.打开目录 #inclu ...