奋斗的蘑菇 原文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. html(对php也有效)页面自动刷新和跳转(简单版本)

    <html>    <head><title>html页面自动刷新和跳转</title><meta http-equiv="Refres ...

  2. Ubuntu 12.04 LTS 安裝无线网卡驱动

    1,当然,首先下载得到驱动的源代码: 2,解压缩到指定位置,我就是用鼠标拖到 home 里面: 3,进入驱动所在目录 CD ~/mt7610u,(我将解压缩出来的驱动目录改名为 mt7610u 这个了 ...

  3. Codeforces 834D The Bakery 【线段树优化DP】*

    Codeforces 834D The Bakery LINK 题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献 是第一次做线段树维护DP值的题 感觉还可以, ...

  4. Robotframework第1课--安装RF

    大家好,我是孟船长,现从事自动化测试的工作,工作用的工具就是Robotframework,现在把这“几年”的所得分享出来,希望新进入这行的朋友能够少吃点“新人苦”,能够早点入手robot framew ...

  5. Linux 错误码对照表

    errno 在 <errno.h> 中定义,错误 Exx 的宏定义在 /usr/include/asm-generic 文件夹下面的  errno-base.h 和 errno.h,分别定 ...

  6. 关于1024:堆栈下溢的错误(1024. Stack Underflow Occurred)

    http://blog.163.com/sylar_lin/blog/static/192332093201111242412487/ 今天碰到个很奇怪的问题,注释掉下面的trace,realse版本 ...

  7. SharePoint2013 中集成AD RMS 与Office Web App 2013集成

    SharePoint2010时Office Web App2010是一个让人又爱又恨的产品,尽管能够在WEB上查看与编辑文档,甚至能够多能协同编辑,但总会遇到两个看似普通的需求却需要给业务人员大费口舌 ...

  8. POJ 3279 Fliptile(反转 +二进制枚举)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13631   Accepted: 5027 Descrip ...

  9. temple-html5

    ylbtech-HTML5:  1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   1 ...

  10. Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

    在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很 ...