csharp反射和程序集

csharp反射和程序集
csharp反射和程序集

学习笔记:反射初步理解、应用

2011-8-31 反射无处不在,作为程序员,每天都在使用。Vs的智能提示,就是通过反射获取到类的属性、方法等。还有反编译工具也是通过反射实现。

程序集介绍

程序集是.net中的概念。.net中的dll与exe文件都是程序集。pdb是一个保存调试信息的文件。exe与dll的区别:exe可执行文件,其包含入口函数Main();dll为类库编译生成的文件,不可直接运行。

扩展:如果在类库中写一个静态Main(),并在类库上右击,选择属性,把类型改为可输出(输出类型指Windows Form应用程序和控制台应用程序),那么这个类库也可以执行了。

程序集(Assembly),可以看做是一堆相关类打的一个包,相当于java中的jar包(*)。

程序集包含资源文件(如窗体加载的图片,原文件删除仍可以显示)、类型元数据(描述在代码中定义的每一类型和成员,二进制形式)、IL代码(微软中间语言,这些都被装在exe

或dll中)。每个程序集都有自己的名称、版本等信息,这些信息可以通过每个项目中Propertities文件夹下的AssemblyInfo.cs文件来自己定义。

程序集好处

?程序中只引用必须的程序集,减小程序的尺寸。把不同功能放到不各自的程序集中,需要什么功能只引用某一程序集即可。

?程序集可以封装一些代码,只提供必要的访问接口。

添加程序集的引用

添加路径、项目引用、GAC(全局程序集缓存,不需要把dll文件拷到exe文件的

目录中,例如.net系统dll)

GAC的详细配置参考:https://www.360docs.net/doc/027647105.html,/kb/815808/zh-cn

GAC目录C:\WINDOWS\assembly

不能循环添加引用

在c#中添加其他语言编写的dll文件的引用。(参考PInvoke,在.net中调用非程序集

的dll)

反射就是动态获取程序集的元数据(提供程序集的类型信息)的功能(或理解为:通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等)。反射可以直接通过.dll来创建对象,调用成员。反射让创建对象的方式发生了改变。

Type类实现反射的一个重要的类,它在编译生成的dll中以二进制形式存储已经写好的各种类型。通过它就可以获取程序集中类的所有信息包括方法、属性等。可以动态调用类的属性、方法。Type是对类的描述,它是一种类型。

先定义类库,包含公有Person类和Iface接口、以及私有委托Mydelegate。类库类图实际可能不提供,这里为了方便说明Type类。

属性

方法

Type类的常见使用

通过类获得Type:Type t = typeof(Person) //反射用这种方式

通过对象获得类的Type:Type t = p.GetType()

调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。

调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public 类型。

调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。

Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,但返回值类型为object,如果类没有无参构造函数就会报错。

Type类的常用方法

?bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变

量是不是可以接受c类型变量的赋值。

?bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o

的类、父类、接口)

?bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。

MemberInfo类抽象类,有很多子类,下面讲的类都继承自它,获取程序集成员的相关信息(类型、方法、事件、字段和属性)

?PropertyInfo 获取属性

主要成员:CanRead、CanWrite、PropertyType属性类型;SetV alue、GetV alue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。

pInfo.SetV alue(p1, 30, null)

?MethodInfo 获取方法

MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。

?FieldInfo 获取字段

?EventInfo 获取事件

反射的实际应用:

开发NotePad插件

准备工作

1.获得当前应用程序运行根目录

string path = AppDomain.CurrentDomain.BaseDirectory (会受openFileDialog等影响)

string path= Assembly.GetExecutingAssembly().Location (better)

2.获取插件的目录path = https://www.360docs.net/doc/027647105.html,bine(path,”插件文件夹名”);

3.获得插件目录下所有dll插件

Directory.GetFiles(path,“*.dll”)

4.动态创建菜单

ToolStripMenuItem.DropDownItems.Add("name");

响应菜单事件,item.Click += new EventHandler(item_Click);

如何点击菜单的时候知道点击的是哪个菜单?sender就是被点击的菜单项:

ToolStripItem item = sender as ToolStripItem。

在添加菜单项的时候将菜单的Tag保存插件对象,在item_Click函数中再从菜单项

的Tag中读取即可。

实际开发

先写一个NotePad软件,在程序中需要设计对以后开发的插件处理。软件写好后并不是所有的插件都能用于NotePad的扩展,需要使用接口做一个约定。也就是以后开发的插件必须按规定的格式进行。

NotePad代码

接口,开发插件遵守的约定

转换大写的插件代码。建一个类库,实现接口,编译生成后拷贝到指定目录接口实现NotePad的功能扩展。

反射的应用练习:

写好主程序,留出接口,开发关机插件和字典插件,显示在statusStrip中。

接口:

主程序:

插件:

用户登陆界面程序vb设计说明书

工程学院 课程设计说明书 课程名称: 计算机应用基础课程设计 课程代码: 题目: 用户登录界面程序设计 年级/专业/班: 学生姓名: 学号: 开始时间: 2011 年 4 月25 日 完成时间: 2011 年 5 月 8 日 课程设计成绩: 指导教师签名:年月日 目录 摘要 (2) 1 引言 (3)

2 设计方案 (4) 2.1程序功能设计 (4) 2.1.1系功能描述 (5) 2.1.2系结构分析 (5) 2.1.3系统流程分析 (5) 2.2程序界面和代码设计 (7) 2.2.1系统工程设计框架 (7) 2.2.2系统各界面设计及代码设计 (7) 3 结果分析 (11) 结论 (14) 致谢 (15) 参考文献 (16)

摘要 随着计算机的普及,计算机高级语言已经运用到生活中的各个方面,本次课程设计使用VB语言作为开发工具,进行了用户登录系统的程序设计,该程序能实现用户登录系统的模拟功能,进行用户的登录,提醒,注册,退出等操作,这些操作都能模拟实际生活中的登录情况,最后分析所开发软件系统的优点和不足。该运行界面清晰实用,操作方便。 关键词:用户登录模拟操作界面

1 引言 随着科学技术的发展,计算机已经应用到生活、工作的各个方面。VB一种可视化的、面向对象和采用事件驱动方式的高级程序设计语言,可用于开发Windows环境下的各类应用程序。本次课程设计主要内容就是使用VB编制简单、实用的小程序,以巩固我们所学的计算机VB语言知识,提高分析问题和解决问题的能力,锻炼我们独立动手的能力以及综合创新能力。 1.1 选题背景 通过一个学期对Visual Basic 高级语言程序设计的学习,我已经掌握了一些常用的控件的使用方法,对简单的程序设计的常用算法也有了一定的了解,还掌握了对文件输入与输出的一些基本操作。为了进一步加深理解、验证、巩固课堂教学内容,加深对可视化编程思想的理解,强化Visual Basic对程序流程控制、常用控件的属性、事件、方法的理解和使用;为了进一步提高编程能力、程序的调试能力,理论联系实际的能力;巩固所学的这些程序设计的方法,为了达到后续课程对实际编程计算能力的要求,特选定“用户登录界面程序设计”题目作为课程设计实践教学环节的题目,有助于培养综合运用所学知识解决实际问题的能力,可以充分发挥想象力和创新能力;有助于提高独立思考能力,自学能力 1.2任务与分析 任务:设计一用户的登录窗口界面,实现模拟用户登录系统时的各种情况 具体要求:遵循面向对象和结构化程序设计的编程思路,设计合理的界面,设置所需控件及其属性,编写相应的事件过程,并上机调试程序,在基本要求达到后,进行一定创新设计 预期功能:实现用户成功登录系统,当用户明不正确或者密码错误时,提醒用户重新输入或者注册,当三次登录失败时,强制性退出操作界面。 涉及的VB知识点:界面设计,command控件、text控件及其属性,随机的读出于追加。

登录界面代码

在https://www.360docs.net/doc/027647105.html,平台下用C#和Access实现用户登录界面的窗体应用程序 一直就想加个technology的类别,但却迟迟未能动笔.一来不得不承认直到现在,我在技术上还依然只是一个没怎么入门的菜鸟,二来技术本身也不是我的兴趣所在.但不管怎样,既然我现在还要攻读计算机专业的硕士学位,那么技术,总还是要学的. 需要说明的是,对于那些高手来说,这里的东西想必都是小菜一碟,不值一提.我写在这里,只是给自己的总结吧.另外我所写的东西,很多也是参考网络和书籍的,其实真正属于我自己的东西也不多.由于四处查找,具体的出处很多也已记不清了,而且在开源环境下也很难说某些代码就是谁的原创,所以这里虽然没有说明,但很多东西也都是参考他人的,在此先要对那些给了我帮助的书籍作者,网上的发贴人和回贴人表示感谢. 去年研一刚开学时,自己的实践能力还几乎为零.因为我心里清楚,自己本科的确是混过来的,计算机科学与技术的学士学位,我其实是不配去拿的.九月十号进实验室后,开始学习项目组里需要用到的C#,但单纯学习语言也没什么明确的目的性.实验室里和我同一导师本校保研的同学和我说起,他们大四下学期刚进实验室时,师兄就让他们先试着写一个类似QQ登录那样的一个用户登录程序.我自己没有任何经验,想也就像他们一样,从这里起步吧,于是在看C#的同时我就考虑怎么样去实现这样一个程序了. 我知道对于过来人来说,这样的一个程序实在是再简单不过了,但对于当时刚开始的我,着实费尽了不少周折.虽然后来基本实现了这样一个程序,但在数据库上还是有些问题.因此虽然当时也曾想过贴个technology类别的日志,但终究还是一直拖了下来. 前段时间通过同学的介绍,帮沈阳日报的一个朋友做了一个会员管理的软件.软件本身也极其简单,基本没有太多的技术含量,但在开发的过程中自己通过各种渠道去查找资料,也在各方面都学到了很多.所以这段经历对我还是很有意义的.而且自己在计算机专业学了四年有半后终于可以自己做出来一些可以应用到实际中的东西,也终于凭借自己的专业能力获得了一点回报,无论回报是多是少.嗯,是要鼓励一下自己的.也激励自己再接再厉! 此后我可能会把在这一软件中所学到的东西陆续总结一下到这里.而这一软件开发的第一个模块也就是用户登录模块.也就是我最初在尝试做的东西.好,说了这么多无关的话,现在言归正传,来看登录模块的具体实现. 由于用户登录模块的实现关键的一点就是要将用户的信息存储在数据库中,并在用户登录时到数据库中对信息进行查找和核对,所以首先要先建立一个数据库.实际上对于初学者来说,数据库的相关操作也正是实现本登录模块的难点所在.这也是当时我刚开始写这段程序时困扰我并困扰了我很久的地方.在数据量不是很大的情况下,可以就用微软Office组件里的Access数据库,比较方便.这里在D盘用Access建立一个数据库命名为db.mdb,并在数据库中建一个表,命名为users ,在表中建两个字段,命名为userName和userPassword,分别存储用户名和密码.然后在表中插入几条数据,用于登录界面的测试.下面是登录模块的开发. 在Visual Studio2005的C#开发环境下,新建一个Windows 应用程序的项目,将第一个窗体命名为Login,即作为用户登录窗体.在窗体上添加相应控件,设计效果如下:

基于LABVIEW的用户登录界面设计

基于LABVIEW的用户登录界面设计 Labview具有功能强大的数学工具,用在传感器设计上可大大降低软件的设计负担。对于一个实际的传感器使用,其用户数量有限,其登陆界面设计可以完全借助其数组函数与数据记录文件完成,而不就是数据库,这样既减轻了系统的重量,也减轻了系统的负荷。没有牵涉第三方的软件,系统的稳定性也大大提高。本文设计了一个简单的用户登录系统的2个模块,希望能对读者有所启发。 1)用户初始文件的建立 Labview的数据记录文件具有较强的功能,并且不能用写字本打开,因此作为一般的保密级别可以用来存储初程序运行环境数据,本文用来存储登陆系统的用户数据。 本程序采用两个套嵌while循环,用于批量产生用户名单,内While

采用三个文本输入框,分别输入用户姓名、用户初始密码、用户权限等内容,并用系统时间空间获取用户建立时间,通过数组创建函数创建成一维数组,点击确定键完成一个用户的建立,可以继续进行下一个用户的建立(当然您也可以只建立一个超级用户,在超级用户登陆后继续建立用户名单),用户建立完毕点击停止按钮完成用户名单建立,形成一个二维数组,由于点击停止键时,最后一个用户名单会重复建立,故采用数组删除函数去掉最后一行,然后创建一个文件,用数据记录函数将该名单存储在您希望的文件夹内(本例放在桌面上,面板上的数组就是为验证程序而建立的,可以去掉)。 2)登陆界面 登陆面板实际上只有两个文本输入控件:用户名与密码。程序首先将记录文件读入内存,让后将第一列(索引0列)的所有用户列出来,用一维数组搜索函数搜索该用户密码所在的行号,再用该行号将该用户的信息从记录文件索引出来。由于密码放在第二列(1列),直接从用户的记录信息索引第第二列(索引1列)取出该用户密码),直接用文本比较“等于”函数进行比较用户输入的密码就是否与其预设的密码一致。 至于修改用户名单、用户权限等内容可用“数组的删除、插入”

登录界面代码(vs)

https://www.360docs.net/doc/027647105.html,入门篇【项目实战】打造一个自己的相册(二)登录模块 2009年11月15日星期日 12:05 本文原创,转载请说明,本文地址: https://www.360docs.net/doc/027647105.html,/44498/blog/item/59db5da17d24c28146106478.html 进行本次项目实战,需要有一定的C#基础知识,所以,在初期的几篇里面,我在文中尽可能的多贴图以进行示例,以后逐渐减少图片说明。 昨天已经介绍了流程和基本功能,今天简单的介绍一下用户登录模块的做法。 不要担心,非常简单。 打开Login.aspx页面,这是我们昨天设计的空白页面,用户登录,现在,我们来完善它的外观和功能。 简单的登录需要一个账号输入框,一个密码输入框,以及一个提交按钮;如图所示: 当然,喜欢用https://www.360docs.net/doc/027647105.html,的标准控件库也行,喜欢用HTML组的控件也可以。 在输入密码的时候,都是以"*"号密文显示的,那么我们要调整一下密码框的属性,指定其类型是password类型。如图:

界面设计完毕,是个什么样子呢?大概的看一下吧,还算说得过去。 【如果要更好看,当然需要美工人员的帮助】 然后,该实现登录的功能了吧? 先谈谈我们的目标,也就是输入账号和密码以后,如果通过验证,则跳转到Default.aspx页面,提示登录成功,反之,则给予相应的提示。 账号和密码保存在哪里呢?当然是数据库里。 好,我们来创建一个数据库吧。【我这里使用的是SQL SERVER 2005,当然,你用其他的也行】 打开红圈选中的 SQL Server Management Studio ,其实也就等同于SQL SERVER

用户注册、登录系统设计要点

用户注册、登录系统设计 采用的软件:Mysql+Tomcat6.0+Myeclipse 7.0 1.数据库的设计: 2.程序实现思路: 如果要完成用户登录,则一定要有一个表单页面,此页面可以输入登录用户名和密码,然后将这些信息提交到一个验证的jsp页面上进行数据库的操作验证,如果可以查询到用户名和密码,那么就表示此用户是合法用户,则可以跳转到登录成功页。如果没有查询到表示此用户是非法用户,应该跳转到错误页面提示。 3.用户注册页面:registerForm.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

用户注册: 用户名: 密码:
跳转到的注册页面:register.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ page import="java.sql.*" %> <% request.setCharacterEncoding("gb2312");//设置接收编码格式 String requsername=request.getParameter("username");//接收参数username String reqpassword=request.getParameter("userpassword");//接收参数password %> <%

(完整版)JSP登陆页面代码

静态的登录界面的设计login.htm,代码如下: Html代码 1. 2. 3. 系统登录 4. 14. 15. 16.

17. 18. 19. 20. 22. 23. 24. 25.
26. 27.
28.
29.
33. 34. 35. 36. 37.
系统登录 21.
用户名
密  码
30.    31. 32.
38.

登陆界面设计(附带登录权限)

Private Sub Command1_Click() If Text1.Text = "" Then MsgBox "用户名不能为空,请输入用户名!", vbCritical, "提示" Else rs.MoveFirst rs.Find "uname= '" & Trim(Text1.Text) & "' " If rs.EOF Then Text1.Text = "" Text2.Text = "" Text1.SetFocus MsgBox "用户名输入错误,请选择!", vbCritical, "提示" Else If Text2.Text = "" Then MsgBox "密码不能为空,请输入密码!", vbCritical, "提示" Text2.Text = "" Text2.SetFocus ElseIf rs.Fields("upwad") = Text2.Text Then Select Case rs.Fields("bright") Case 0 If Combo1.Text = "管理员" Then MsgBox "管理员已成功登录!", vbExclamation, "提示" Form1.Hide Form2.Show Else MsgBox "您没有此权限!", vbOKOnly + vbCritical, "提示" End If Case 1 If Combo1.Text = "游客" Then MsgBox "游客已成功登录!", vbExclamation, "提示" Form1.Hide Form2.Show Else MsgBox "您没有此权限!", vbOKOnly + vbCritical, "提示" End If End Select Else MsgBox ("密码输入错误,请重新输入!"), vbCritical, "提示" Text2.Text = "" Text2.SetFocus End If End If End If

php用户登录页面代码源代码

//登入页面 $conn=mysql_connect('127.0.0.1','root','')or die("连接失败"); mysql_select_db('tujian',$conn)or die("未找到该数据库"); define(ALL_PS,"vivid");mysql_query("set names GBK"); if($_POST[submit]){ $postcode=strtolower($_POST["code"]); $postcode=strtoupper($_POST["code"]); $uid=str_replace(" ","",$_POST[uid]); $sql="select * from users where `uid`='$_POST[uid]'"; $query=mysql_query($sql); $user=is_array($row=mysql_fetch_array($query)); $mi=$user?md5($_POST[pass].ALL_PS)==$row[pass]:FALSE; if($mi){ $_SESSION[uid]=$row[uid]; $_SESSION[name]=$row[name]; $_SESSION[id]=$row[id]; $_SESSION[user_shell]=md5($row[uid].$row[pass].ALL_PS); if( $_SESSION["code"]==$postcode){ echo""; }else{ echo"

验证码输入错误,请重新输入!
"; } } else{ echo"
用户名或密码输入错误
"; session_destroy(); } } ?>