C#实验课

2024-09-26

C#实验课(共9篇)

C#实验课 篇1

1 概述

实验室是科研成果的产出地, 所以国家或单位对实验室的投入都非常大。每个高校也都有很多实验室, 但是在管理方面由于各种原因造成实验室使用率不高。其中实验室资源不能合理、即时的分配, 实验室管理人员的管理效率的低下是主要的原因。采用c#语言在.NET环境下结合SQL Server数据库开发出B/S模式的实验室管理系统能提高实验室人员的效率, 减少重复劳动, 使资源尽最大充分利用。

2 系统结构 (功能) 设计

2.1 系统需求分析。

实验室管理的工作主要有:需要每隔一段时间根据实验室具体情况发布实验室最新新闻。要方便实验项目卡的填写与收集, 实现无纸化操作。由于该系统主要是在高校使用, 所以要涉及到实验室的空闲状况, 即要看实验室是否在上课或者是否正在进行实验, 这个过程需要有课程调度。实验室的固定资产很多, 当每年进行资产清查时候, 如果没有信息化的资产可供查看, 那么靠人工记录或者清查是个很烦琐的事情, 而且容易出错。平时由于耗材的使用, 必须要求不定期的去购买零星材料, 零星材料如果没有严格的把关购买管理体系, 那将是会出现不必要的浪费和混乱的账目。

2.2 系统结构。

系统的结构如图1所示, 设计的实验室管理系统分为7个子系统:信息发布、实验项目卡、资产管理、课程调度、零星采购、审批、后台管理。每个子系统又有各自的子模块。2.2.1信息发布:实现发布最新的实验室重大新闻及重要大型仪器的更新等。所有的外网浏览人员都可以观看该部分。2.2.2实验项目卡:主要实现实验项目卡的填写、收集、分析, 查询等功能。每学期末, 每个老师都可根据自己开的实验课在此子系统找到相应的填写格式向实验室交实验项目卡, 这也避免了教师要找填写格式的麻烦。在教师填写前由信息录入员将本学期所开的实验课的基本信息录入系统中, 教师在填写时候只要找到课程名字就可以方便往下选择填写了。实验室管理员可以通过系统的统计分析功能查找到哪些教师哪些课程实验项目卡没交等。2.2.3资产管理:实现与实验室固定资产相关的管理及资产使用状况等。包括:仪器设备;字典库;字典查询;借用记录;维修记录;仪器运行记录;分室仪器情况;资产管理员这几个子模块。仪器设备主要添加、删除固定设备的信息, 编辑设备的状态, 及使用情况。字典库用于填写固定仪器设备时所需信息的代码的编辑。字典查询主要实现填写固定仪器设备时所需信息的代码的查询, 如仪器“报废”这一信息用数字“1”代替。借用记录用于记录设备借用的情况。维修记录用于记录设备维修的情况。仪器运行记录用与教师上课时填写实验室信息。分室仪器情况用于显示当前各实验室的设备数量使用情况等。资产管理员这一模块用于设置分配资产管理员的权限。2.2.4课程调度:实现实验室课表的调度分配。包括:查看课表, 课程申请, 课表管理, 课表审批, 修改课表权限这几个子模块。查看课表这一模块用于所有人对实验室课表的查看。课程申请用于教师的实习课等的申请。课表管理用于实验员修改自己所管实验室的课表。课表审批用于实验室主任审批申请的课。修改课表权限这一模块用于实验室主任给实验员以修改课表的权限, 防止实验员私自调课造成管理混乱。2.2.5零星采购:实现购买的实验用的耗材的管理。包括:填写采购表, 采购物情况, 低值品登记, 编辑低值品这几个模块。填写采购表用于填写物资采购审批表。采购物情况用于查看申请的物资采购。低值品登记用于填写低值品的使用情况。编辑低值品用于编辑低值品的登记情况。2.2.6审批:实现各种审批功能。2.2.7后台管理:实现该系统的管理。包括:权限管理, 超级用户, 实验室名编辑。权限管理用于管理员管理所有人的权限, 这里的权限分为:教师权限, 信息录入员权限, 实验员权限, 领导权限, 系统管理员权限。超级用户用于初期进入系统时对管理员的设置, 具有该系统最高管理权。实验室名编辑这一模块用于管理员对各实验室名的更改。

3 系统设计与实现

3.1 系统开发环境及技术。

客服端使用IE6.0及以上;开发工具使用Microsoft Visual Studio.NET2003;界面设计部分采用Photoshop;网页框架、布局设计使用Dreamweaver;开发语言为c#, VBScript, JavaScript, XML。服务器端采用windows2003 Advanced Server, 使用自带的IIS6.0, 数据库使用SQLServer2000。本系统采用的B/S结构, 具有维护和升级方式简单, 异地浏览方便和信息采集的灵活性等特点。B/S结构采用3级结构即数据库级、WEB级、客户级。客户端通过WEB浏览器访问后台数据库。利用ADO.NET这一与数据源进行交互的面向对象类库的技术, 实现对数据库的编程。

3.2 数据库设计。

数据库是一个系统的核心, 它承载着各种数据。把这些数据放置在各个表里。由于本系统涉及的表比较多, 所以只重点描述实验项目卡表、实验资产表、课程申请调度表这3个比较基础且重要的表。3.2.1实验项目卡表设计 (LBS_XiangMuKa) 。实验项目卡表是实验项目卡这一子系统的核心表, 这一部分其它表都与它建立约束级联关系。主要字段有:项目卡编号、实验序号、实验名称、课程编号、课程名称、专业分类号、面向专业、所在实验室、实验类别、实验类型、实验要求、实验者类别、实验者人数、组数、日期、填卡人等, 以项目卡编号为主键。3.2.2实验资产表 (LBS_ZiChan) 。实验资产表是资产管理这一子系统的核心表, 这一部分其它表都与它建立约束级联关系。主要字段有:仪器编号、领用单位号、分类号、仪器名称、型号、规格、单价、厂家、出厂日期、购置日期、所属分室、管理员、入库时间、现状等, 以仪器编号为主键。3.2.3课程申请调度表 (LBS_ShiXiShenQing) 。课程申请调度表是课程调度这一子系统的主要的表。围绕课程申请进行各种课的调度。主要字段有:教师序号、教师姓名、教学班代号、课程代码、课程名称、实习开始周、实习结束周、实习总课时、申请时间、审批人、审批日期、可调课者等, 以教师序号为主键。

4 系统部分功能程序的设计

DropDownList这一服务器控件在本系统的应用比较广, 熟练掌握该控件有助于该系统方便有效的实现很多功能。以下程序部分实现将LBS_XianZhuang表中的字段组合起来放在DropDownList控件中, 方便客户填写时候选择。

结束语

对实际的需求和各个功能模块进行了分析, 对关键部分技术进行了描述。通过对B/S模式下基于c#的实验室管理系统的不断的测试和改进, 已经能够给实验室管理人员和用户带来了便利。本系统具有简单易用, 移植方便等特点, 提高了实验管理人员和教师的工作效率。

摘要:为了提高实验室的管理效率, 在B/S模式下基于c#在.NET环境下对实验室管理系统的研究。详细的论述了该系统的各个模块和实现方法。结合实际校园实验室的应用, 具有即时化、自动化等实用意义。

关键词:B/S,c#,.NET,实验室管理

参考文献

[1]章立民.用实例学ASP.NET——使用C#与ADO.NET[M].北京:电子工业出版社, 2004.1

[2]余远波.基于.NET的实验室信息管理系统研究[J].现代电子技术, 2008, 第4期

[3]付磊.ASP.NET编程实作教程[M].北京:北京希望电子出版社, 2002.6

[4]Scott Worley.ASP.NET技术内幕[M].北京:人民邮电出版社, 2002.4

[5]David M.Kroenke.数据库原理[M].北京:清华大学出版社, 2008.9

[6]吴晨、孙少波、叶莞.ASP.NET数据库项目案例导航[M].北京:清华大学出版社, 2004, 12.

C#实验课 篇2

2、在Visual Studio.NET集成开发环境下,可以开发多种不同类型的应用程序。最常见的有以下几种。

。控制台应用程序

。Windows应用程序

。ASP.NET网站

3、开发和运行控制台应用程序

创建一个控制台应用程序,主要包含以下步骤:

(1)执行文件—》新建—》项目

(2)打开“新建项目”对话框,在“项目类型”列表中选择Visual c#节点下的Windows,在“模板”窗格中选择“控制台应用程序”项目模板,输入项目的名称、位置及

解决方案名称后,单击“确定”按钮。

(3)在打开的.cs文件中编写代码。

(4)运行程序。执行“调试”—》启动调试菜单命令,编译并运行程序

4、c#程序的基本结构

。using关键字的功能是用于导入其它命名空间中定义的类型,包括.NET类库。例如,代码中使用的console.readline方法实际上是一个简写,其全称是system.console.readline,但由于在代码的开始使用using指令引入了system命名空间,所以后面可以直接使用console.readline来进行输入。

C#在成长 篇3

C#读做"C sharp“, 是一种安全现代而又优雅的面向对象的编程语言。1999年原BROLAND公司的首席研发设计师Anders Hejlsberg在微软开发了Visua J++1.0, 很快的Visual J++由1.1版本升级到6.0版。由于微软违反了了许可证协议中的条款, SUN公司就microsoft违反了Java开发平台的中立性, 对微软提出了诉讼, 应而微软不得不停止对j++的研发。不过, 2000年6月26日微软在奥兰多举行的“职业开发人员技术大会” (PDC 2000) 上, 发表新的语言C#。C#语言取代了Visual J++, 语言本身深受Java、C和C++的影响。C#本身继承了C和C++强大功能, 同时将它们的一些复杂特性如宏和模板, 多重继承去掉了, 同时综合了VB简单的可视化操作和C++的高效率, 以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

2 发展

微软于2000年7月发布了C#语言的第一个预览版。因此人们一般认为C#是2000年发布的, 并以此来计算它的“年龄”。其实, 在此后的一年多时间里, 微软一直在修补各个测试版本中的BUG。直到2002年2月, 微软才推出了迟迟未上市的Visual Studio 7.0, 并将其定名为“Visual studio.NET2002”。伴随着这套开发环境, C#语言的第一个正式版本——C#1.0出现了。这一时期的C#提出了纯粹的面向对象概念它将所有对象自动的变成为COM对象, 以ASP和windows环境的紧密集成, 如果c#能取得很大的市场份额的话, 它将给ASP带来类似于Java的功能。Java尽管号称是面向对象的, 但实际上, 对于对象所应该具备的三种构成结构——属性、方法和事件, Java仅提供了方法, 其它两种结构都要通过方法来模拟。在C#1.x中, 所有面向对象的概念都在语言中得到了非常好的体现。

2004年的6月份发布了Visual Studio2005的第一个Beta版, 同时向开发者展示了C#语言的2.0版本。2005年4月, 微软发布了Visual Studio 2005 Beta2, 这已经是具备了几乎全部功能的Visual Studio, 包括的产品有SQL Server2005、Team Foundation Server和TEAMSUITO。这时的C#编译器已经能够处理C#2.0中所有的新特性。

2005年9月份的PDC大会上, 微软带来了研发代号—魔鬼的c#3.0。3.0的Lamda Linq, 集合对象初始化支撑起3.0的魔鬼代号。在C#3.0中, 我们可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。例如要查找一个字符串数组cat中所有长度为3的字符串, 就可以写:var long=from n in cat where n Length=3 select n;同时W PF, W C F, WF F等新技术的加入使c#发展的更魔幻WPF (下一代显示系统) , 它可以创建能带给用户震撼视觉的windows客户端应用程序, 还可以创建广泛的独立应用程序以及浏览器承载的应用程序。WPF的界面由可扩展应用程序标志语言 (XAML) 来实现, 在WPF中可使用dockpanel与border控件配合进行界面布局。

C#4.0新增dynamic关键字, 提供动态编程 (dynamic programming) :Dynamic Lookup动态查找, The dynamic type dynamic类型, Dynamic operations动态操作类似于Java Script把既有的静态物件标记为动态物件, 4.0的动态编程使得对象变的越来越“动态化”, 你无法通过静态类型捕获它们的结构和行为。例如:通过IDispatch访问的COM对象, 通过反射访问的一般.NET类型, 结构发生过变化的对象等。C#4.0中的新特性分为四组——动态查找Dynamic lookup, 命名参数和可选参数Named and optional parameters, 特定于COM的互操作特性COM specific interop features, 变性Variance。Dynamic类一种特殊的object类, 其定义的对象可以动态的使用:dynamic dn=1;int a=dn;dynamic dn=1;int a=dn;不仅是方法调用, 字段和属性访问、索引器和运算符调用甚至委托调用都可以动态地分派

如果你想体验一下4.0就装个visual studio 2010吧。4.0的动态编程, 可选参数使c#又发展到一个新的高度。c#如此迅猛地发展, 升级, 特别是荧光和WPF已得到大量使用, 在UI体验这一块, .NET已走在前面。确实让人感觉来势如虹, 但尽管如此, 仍有很多人认为:c#也就现在还行, Java发展前景广阔, java比.net要安全一些, 用的人多了, 也就发展, 完善了。因而现下大多数学编程的人都会选Java。

3 未来

C#实习日志 篇4

日志一

日期:2012年6月25日星期一天气晴

今天是我们C#实习的第一天,我们上午9点在机房210开始我们为期两周的实习。这次C#实习的指导老师就是我们的任课老师危老师,而且这次实习还有两位研究生带领我们实习,这是以前没有的,相信有他们的帮助,我们能够更快的完成这次实习任务。老师先将我们的实习任务下发给我们,并花了15分钟的时间简单的向我们简述了这次实习的内容。我觉得老师为了我们更好地安排好时间,还帮我们规划好实习的具体安排,制定了具体的时间表。我在仔细阅读了实习指导术书,开始了今天的实习。而今天的实习内容就是建立数据库,创建一些表结构,并填写一些相应的信息。其实今天的任务就是后来的实习做的准备,后几天的任务就是建立在这些表上,创建一些窗体,并建立链接。今为天的实习内容相对比较简单,但我阅读了整个实习指导书,后面的实习还是很难得,有许多要写很长的代码,用到了我们学的C#编程,所以明天要带C#的书。今天的实习就这样,今天计划回去好好看看以前的C#书,为以后的实习做好准备。

日志二

日期:2012年6月26日星期二天气阴

今天是实习的第二天,我感觉真正的实习开始了,今天的实习任务,我感到了难度,好在有指导研究生的帮助,以及老师的一些代码,我才能顺利完成。今天的实习任务是创建windows窗体,根据老师实习指导书上的要求,其实设计这个主界面和用户登录界面还是比较简单的,就是使用一些控件。但这些控件使我们以前在课上没有接触过的,但老师在指导书上都有相关的提示,所以设计这些界面还是比较简单的。但问题是,Form间的链接以及相关的代码编写有很大的困难,特别是登陆界面上用户名称和用户密码的认证,再弹出主界面,这一段的代码,我遇到了很大的困难。我再仔细阅读了老师所给的代码后,用了其中的代码,并根据实际境况做了相应的更改。但用户名称和用户密码的认证,确定正确与错误,我有点迷糊。但在指导老师的指导下,他告诉我,用户名称和密码的认证是要求同时满足的,而且正确时才能登陆主界面,若错误就会退出。我在理解基本原理思路后,终于编写好正确代码,并运行,但还是有错误。我就设置了断点,查找出错误,最终完成这个主界面和用户登录界面的设计。今天的实习,我是体会到老师的那句话“学地理信息的,不会编程就白学了",而且实习真正开始了,希望明天的实习能够顺利完成。

日志三

日期:2012年6月27日星期三天气阴今天是实习的第三天,通过昨天实习的经验,我终于开始对这次的实习有所了解,也开始愿意去做了。今天做的是学生入学模块,根据实习指导书的内容,和之前做的相比,也是先做windows窗体的设置,就是用各种控件设置,然后和之前不同的是,这个窗体要使用dataGridView控件,而且要加载项目数据源,也就是要与数据库连接起来,用这些窗口运行查找数据库的数据并修改等。但在几年的实习中我遇到了很多我没想到的问题,特别是加载数据源时,我的数据库变化,就要重新加载,但又出现了很多错误,运行不了。实习指导老师也帮我看了这个问题,同样的做法在其

他同学的电脑上就不会存在报错,老师说估计是软件盗版的原因,总之今天做的比较郁闷,我决定下午好好睡一觉,今天有点累了,脑子也被搞糊涂了,只能期望明天的实习能够顺利。

日志四

日期:2012年6月28日星期三天气阴

经过昨天的教训,我觉得先将数据库建立好,然后再做。因为昨天连接数据库做的不好,所以我觉得今天将Form3删除,重新做一遍。下定决心后,我先将数据库的内容根据要求重新设置并加载数据,然后才开始做。先将以前做错的表3删除,再重新开始做新的。有了之前的经验,我做的速度快了好多,设置好窗体之后,就进行了数据连接,而且每个控件都要与数据库进行连接,这些都做完了之后,就要编写查询,删除,保存的代码。但有一个困扰了我很久的就是,删除,保存一直是灰色,无法实现。后来在老师的指导下,只要将空间的一个属性改一下就好了。但其实代码的编写是比较简单的,只要修改一下老师所给的原有代码,根据自己设置的修改就好。在做了这个之后就有了经验,将其他的几个窗体先设置了,计划明天就把其余几个完成,今天收获很多!

日志五

日期:2012年6月29日星期五天气晴

C#实现屏幕截取 篇5

屏幕截取是图像编程的一个重要课题, 可将截取的屏幕作为图像存储在内存中。.NET提供了GDI+作为编程工具, 能够方便地将截取的屏幕以各种图像格式存储起来。目前, 在公开发表的C#屏幕截取编程中, 通常的效果都不好, 在此提供一种效果良好的C#屏幕截取编程方法。

2 API函数进行C#屏幕截取

在SDK platform中, 与此相关的API有GetDesktopWindow、CreateCompatibleDC、GetSystemMetrics、SelectObject、BitBlt、ShowWindow, 可将有关的API封装到相应的C#文件中, 如以下代码封装了CreateCompatibleDC的API函数:

3 存储

为将截取屏幕存储为多种图像格式, 引入了System.Windows.Forms.SaveFileDialog类, 对其Filter属性编程:

以下代码可实现将截取屏幕存储为多种图像格式:

4 实现代码

这样就可以效果很好地实现C#屏幕截取编程了。

5 总结

C#屏幕截取编程需要使用很多API编程, 使用单独封装的cs文件, 即可采用“分而治之”的策略降低编程难度。

(收稿日期:2009-3-16)

摘要:给出了一种效果良好的C#屏幕截取编程方法及其实现代码, 所截取的屏幕能够以各种图像格式存储起来。

C#开发邮件工具 篇6

在工作中, 邮件的发送和接收应该是经常要使用到的功能的。因此知道电子邮件的应用程序的原理也是非常有必要的, 在这一个专题中将介绍电子邮件应用程序的原理、电子邮件应用程序中涉及的协议和实现一个简答的电子邮件收发器程序。

2 邮件应用程序基本知识

2.1 电子邮件原理及相关协议

说到电子邮件的原理, 其实和现实生活中寄邮件和寄包裹是一样的原理的。就先回顾下现实生活中寄邮件的流程吧———首先, 先写好信, 信封上面写好收信人的地址, 写信人的地址, 然后把信放到寄信箱中, 邮局的人会某个时候去这个信箱中的信取出来, 然后邮局的人根据信封上写的收信人地址进行转发到当地的邮局, 当地邮局把信寄到收信人的信箱中 (寄包裹的话可能会电话联系, 像在淘宝, 京东买的东西的, 收货人就是通过电话联系一样) , 最后收信人会到自己的信箱中收取信件。上面大致是平时生活中寄信的一个流程。前面已经讲过电子邮件的原理和这个差不多的下面就介绍本专题中电子邮件的原理, 大家可以和现实生活中的寄信过程进行对比, 这样可以更加容易理解和掌握:

通过电子邮件应用 (例如基于客户端的Outlook电子邮件软件和一些基于Web的电子邮件系统———新浪邮箱、谷歌邮箱、QQ邮箱等都属于电子邮件应用) 将一封写好的邮件 (相当于现实生活中的信, 当然邮件也要写明收件人地址, 邮件内容等信息的) 通过电子邮件协议 (SMTP, 在后面的电子邮件相关协议中会介绍) 发送到SMTP服务器 (就是存储邮件的地方, 相当于生活中的邮局一样) , 然后SMTP服务器根据收件人的地址通过SMTP协议转发到相应SMTP接收服务器上, (SMTP服务器进行转发相当于现实生活中邮局的人配送信的过程, 配送到收件人当地的邮局, 然而现实生活中邮局都是一家, 所以可以相互识别———意思就是发送到当地邮局, 当地邮局会接收, 并且帮助你发送到指定人的信箱中, 在网上就是通过SMTP协议来规定这样的一个过程的, 发送到别人的SMTP服务器上别人的服务器必须要认识发送来的邮件并接收) 结束, 接收端邮件服务器 (POP3服务器) 把邮件存放到接受者的电子信箱内 (相当于当地邮局的人把信放到收信人的邮箱中) , 最后收件人可以登录自己的电子信箱, 再与POP3服务器进行连接, 从POP3服务器上下载发送来的邮件, 这样在收件人的电子信箱中就可以看到发送来的电子邮件了 (这就是现实生活中收信人从自己的信箱中取信的一个过程) 。

上面已经把电子邮件的原理和现实生活中寄信的过程进行对比, 相信大家可以更加清楚电子邮件的原理和发送接收过程的, 其实网络上的很多应用都可以以现实生活的例子去理解, 这样的话可以加深对知识的理解。下面就介绍下电子邮件中的相关协议的内容:

网络上的应用的核心就是协议, 因为协议让网络上的客户端相互认识发生来的数据, 所以电子邮件应用也不例外, 也有相关的电子邮件协议来完成发送电子邮件和接收电子邮件的过程, 这些协议主要是:SMTP (简单邮件传输协议, Simple Mai Transfer Protocol) 、POP3 (邮局协议, Post Office Protocol) 和IMAP (网络邮件访问协议, Internet Message Access Protocol) 。

(1) SMTP———SMTP主要负责将邮件从一台机器转发至另一台机器 (可以对照上面电子邮件的过程来理解SMTP的作用) 。

(2) POP3———3表示POP协议的版本, 主要负责将邮件从邮箱中 (POP3服务器) 传输到本地计算机。

(3) IMAP———现在常用的版本为第四版本, 即IMAP4, 主要负责邮件的检索和处理功能, 客户端不需要下载邮件到本地计算机, 可直接从邮件客户端软件对服务器上的信件和文件目录进行操作, 它是POP3的替代协议。

2.2 邮件系统分类

邮件系统主要分为两类的———基于客户端的邮件系统和基于Web浏览器的邮件系统。Office OutLook就是基于客户端的邮件客户端系统, 而像我们经常使用的QQ邮箱、新浪、网易邮箱等都是属于基于Web浏览器的邮件系统, 基于客户端的邮件系统的收发过程, 通过如图1所示来描述。

发送方通过邮件客户端, 将编辑好的邮件向邮件服务 (SMTP服务器, 在发送过程中也叫发送端邮件服务器) 发送, 发送端邮件服务器根据收件人的地址来识别接收端邮件服务器 (POP3服务器) , 然后向POP3服务器发送邮件信息, 接收端邮件服务器将邮件存放在接收者的电子信箱中, 并告知接收者有新邮件, 接收者通过邮件客户端与POP3服务器连接后, 就可以查看新邮件。

然而, 基于Web浏览器的邮件系统与基于客户端的邮件系统不同的地方如下:

(1) 基于Web浏览器邮件系统用户代理 (代理的概念也就是用户不是直接与服务器进行通信, 而是通过代理的方式, 让代理去与服务器通信, 然后用户在从代理中获的服务器的信息, 代理也就是中间人的作用, 相当于生活中中介, 在.net中很多技术都用到了代理, 例如委托的概念其实也就是代理的一个概念的) 是Web浏览器, 基于客户端的邮件系统而是邮件客户端应用程序, 一般是Windows Form程序。

(2) 浏览器发送邮件到SMTP服务器和从POP3服务器中获得邮件的方式都是通过HTTP协议来实现, 与基于客户端的邮件系统不同 (基于客户端的邮件系统发送通过SMTP协议或ESMTP (Extended SMTP) , 获得通过POP3或IMAP协议) 。

2.3 目前主要的电子邮件服务系统

电子邮件服务系统———就是向大家提供邮箱服务的服务系统, 这样的系统当然是由专门的公司进行研发的, 一般叫这样的公司为邮件服务商, 平常使用的网易邮箱, 新浪、Gmail邮箱等都是建立在电子邮件服务系统。现在主要电子邮件服务系统主要有下面几种:

(1) 基于Postfix/Qmail的邮件系统。例如, 雅虎邮箱基于Qmail系统。

(2) 微软Exchange邮件系统。

(3) IBM Lotus Domino邮件系统。

(4) Scalix邮件系统。

(5) Zimbra邮件系统。

(6) MDeamon邮件系统。

3. Net平台对邮件发送功能的支持

在.Net类库中, 在System.Net.Mail命名空间下定义了对邮件处理的类, 这样使邮件的发送更加方便 (这些类也就是对SMTP协议的封装, 使我们更好地区编程, 只需要使用类中的方法和属性等去完成邮件的发送, 避免写复杂的SMTP协议的命令) 。

C#提供了一系列邮件相关的类, 在这里就不一一介绍了, 大家可以参考MSDN去看每个类的使用, 并且在后面程序的实现部分也会有详细的注释去介绍程序中使用到类的使用。需要注意的是:C#提供的类中只有SMTP的字样, 却没有POP3这样的字样, 这说明.Net类库本身中并没有提供对POP3协议的封装类, 但是可以使用Jmail组件来完成从POP3服务器中收取邮件的功能, 具体的使用将在后面的邮件收发器程序中邮件的接收部分介绍。

4 邮件收发器程序的实现

4.1 邮件发送功能

4.1.1 SMTP协议

SMTP协议是用于电子邮件的传输的协议, 电子邮件是通过SMTP服务器进行发送的, SMTP服务器的默认端口为25, 通常发送邮件有两种方式———一种是不使用客户端认证, 即客户端可以使用匿名发送邮件 (这种方式叫做SMTP) ;另一种是客户端必须提供用户名和密码认证 (这种方式叫做ESMTP, Extended SMTP) 目前大部分邮件服务器采用用户名和密码认证的方式。

客户端发送邮件过程为———先通过客户端软件 (本程序中的邮件收发器) 将邮件发送到SMTP服务器, 然后再由SMTP服务器发送到目标SMTP服务器。下面介绍SMTP协议的内容:

SMTP协议总共定义了14个命令, 命令由命令码和气候的参数域组成, 不区别大小写 (通过前面专题的讲述可以得出各个协议的命令组成都差不多的) , 表1就简单介绍下5个常用的命令码:

电子邮件由信封、首部、正文和结束符号4部分组成, 下面就具体介绍下这4个部分的内容:

(1) 信封

信封包括发信人的邮件地址和接收人的邮件地址, 具体对应两条SMTP命令———Mail from:mytest1989@sina.cn (发信人的地址) 和Rcpt to:test@126.com。

(2) 首部

首部中常用的命令有:

1) Subject:<邮件主题>———表示邮件的主题。

2) Date:<时间>———表示发邮件的时间。

3) reply-to:<邮件地址>———表示邮件的回复地址。

4) Content-Type:<邮件类型>———表示邮件包含文本、HTML超文本和附件的类型。

5) X-Priority:<邮件优先级>———表示邮件发送的优先级, 优先级为3表示为普通邮件;如X-Priority:3。

(3) 正文

正文当然指的就是邮件的内容了, 用Data命令指定, 首部以一个空行结束, 下面就是正文部分。

(4) 结束符号

邮件以“."结束,

接收方收到SMTP命令之后, 会给出一个响应码, 每个命令都只有一个响应码, SMTP响应码也是由3位数字组成, 后面附加一些文本信息, 响应信息的格式为:

响应码<空格>文本信息<回车换行>

客户端发出一条命令后, 服务器端返回一个响应, 发送者在发送下一条命令前必须等待服务器的响应, 成功接收到响应码后才继续发送命令。

附:SMTP常用的响应码:

响应码解释响应码解释

211系统状态或系统帮助响应421服务未就绪, 关闭了传输通道

214帮助信息501参数格式错误

220服务就绪502命令不可实现

221服务关闭传输通道535用户验证失败

235用户验证成功553邮箱名不可用, 要求的操作未执行

334等待用户输入验证554操作失败

354开始邮件输入

4.1.2 邮件的发送过程

(1) 客户端与服务器建立连接 (该步中客户端首先发送EHLO local连接命令, 服务器如果返回“220”响应码表示服务器准备就绪了, 客户端再继续发送“Auto login”命令, 请求登录, 服务器收到命令后返回“334”响应码, 表示要输入用户名, 之后客户端发送用户名命令, 等到响应后再发送密码命令, 具体在程序的实现中也会有注释。)

(2) 客户端发送邮件的信封。

(3) 开始发送邮件数据, (包括邮件首部, 正文和结束符号, 注:结束符号要单独占一行, 表示邮件发送结束) 。

(4) 客户端与服务器断开连接。

4.1.3 发送功能的实现代码

相信有了上面的理论解释邮件发送的过程后, 实现邮件发送的功能并不难的, 并且.net类库中SMTPClient类封装了SMTP协议, 使得实现邮件发送功能就不要记住那些具体的命令了, 只需要使用该类中提供的方法来完成邮件的发送 (当然你也可以通过发送命令的方式实现, SMTPClient类的方法也是完成发送命令功能而已的) , 下面是邮件发送功能的核心代码:

4.2 邮件接收功能

4.2.1 POP3协议

前面介绍了邮件的发送, 当然接收者需要登录邮箱来查看收到的邮件了, 此时就必有有一个协议去读取服务器上邮件, POP3就是这样的一个协议。还有两外一种协议也是用来接收邮件的———IMAP协议, 它与POP3协议区别有:

(1) IMAP使用的端口号是143而POP3邮件服务器通过监听110端口来提供POP3服务。

(2) IMAP允许客户端在邮件服务器上建立文件夹来保持邮件, 而不用把邮件下载到本地。而POP3需要把邮件下载到本地。和SMTP协议一样, 客户端要通过POP3协议从POP3服务器上获取邮件, 也需要先与POP3服务器建立TCP连接, 等待服务器向客户端发送确认信息表明连接成功时, 客户端才可以继续发送命令给服务器来获取邮件, 在POP3协议中, 规定的命令也是几十条的, 每条命令由命令和参数两部分组成, 都是以回车换行结束, 并且命令和参数之间由空格分隔, 命令通常也是由3-4个字母组成, 参数最多可以为40个字符的长度, 而服务器的响应信息是由一个状态码和可能附加信息的字符组成, 所有的响应信息也是以回车换行结束的。状态码和其他协议定义的状态码有点不一样, POP3服务器响应的状态码有两种———“+OK” (确定) 和"-ERR" (失败) 。这样客户端可以通过检查响应的状态码所包含的字符来判断服务器是否响应客户端发送的命令, 即响应信息中包含“+OK”表示成功响应, 包含“-ERR”表示服务器未响应。同时在程序的实现中大家可以通过Debug来查看响应消息的组成, 这样可以加深理解。

4.2.2 邮件接收的过程

客户端从服务器接收邮件的过程主要经历3个状态:授权状态、操作状态和更新状态

(1) 授权状态———客户端发送与POP3服务器的TCP连接请求, 服务器接收后发送一个响应确认信息之后, 此时客户端需要发送正确的用户名和密码进行确认, 因为在邮件服务器上有很多用户邮箱, 只有提供正确的用户名和密码才有权限访问自己的邮箱, 就像现实生活中邮箱的钥匙一样的。

发送用户名命令:USER test@s126.com

发送密码命令:PASS****** (这两个命令都在代码中有给出的, 大家可以参考代码来理解邮件的接收过程)

(2) 操作状态———如果客户端提供了正确的用户名和密码, 则授权状态也就通过了, 就相当于打开了在服务器上自己的邮箱, 现在用户就有权限进去下载, 查看和删除邮件等操作, 然后在现实生活中的取邮件和删除邮件都很简单 (只要打开了邮箱门, 用手去拿就可以了) , 然后在网络应用上, 这些操作都需要发送POP3命令给服务器, 服务器接收到命令后再给出响应。操作中常用的命令有:

1) STAT命令———该命令从服务器中获取邮件总数和总字节数, 服务器响应命令返回邮件总数和总字节数

如:

?

客户端发送POP3命令:STAT

服务器响应命令:+OK 2 1340
服务器响应命令。

2) LIST命令———该命令从服务器中获得邮件列表和大小, 服务器响应命令返回列出邮件列表和大小。

如:

?

客户端发送POP3命令:LIST

服务器响应命令:+OK 2 message (1430 octect)

服务器响应命令:1700

服务器响应命令:2730

服务器响应命令:<一个空行>

3) RETR命令———该命令从服务器中获得一个邮件, 格式为RETR<邮件编号>

如:

?

客户端发送POP3命令:RETR 1

服务器响应命令:700 octets

服务器响应命令:<邮件头和内容>

服务器响应命令:<空行>

4) DELETE命令———该命令告诉服务器将邮件标记为删除。 (此时只是逻辑删除)

(3) 更新状态———客户端发送QUIT命令后, 此时就进入更新状态, POP3服务器释放在操作状态中取得的资源, 并将逻辑删除的邮件进行物理删除, 然后关闭与客户端的TCP连接。这样整个邮件处理的过程就结束了。

4.2.3 接收功能的实现代码

有了前面接收邮件过程的介绍, 再参考代码的实现, 相信大家可以更好的理解客户端从POP3服务器中获取邮件的过程, 由于.net类库并没有封装POP3协议的实现类, 要实现邮件的获取可以采用发送命令的方式, 也可以使用Jmail组件, 这个组件其实就是POP3协议的封装类, 既然微软没有做, 其他公司做好后来并简单的实现邮件的接收的一个类库罢了。然后在使用这个组件的过程中出现了好几个问题, 在源码中都做了解释, 大家可以下载源代码后查看。

实现邮件接收的核心代码如下:

4.3 程序运行结果

首先输入邮箱名和密码登录到POP3服务器来获取邮件列表的演示, 如图2所示。

然后在邮件列表中选中一个邮件进行阅读, 然后进行回复邮件的操作演示 (邮件的发送都可以附加附件发送出去) :阅读邮件的界面, 如图3所示。

回复邮件的界面, 如图4所示。

同时点击发送按钮后, 就可以把邮件发送到sina的SMTP服务器上, 再由新浪的SMTP服务器转发到QQ的SMTP服务器, QQ的POP3服务器中QQ的SMTP服务器获取收到的邮件, 当QQ用户输入正确的邮箱名和密码后就可以从QQ的POP3服务器上获取收到的邮件。

点击发送按钮后成功发送邮件的图片, 如图5所示。

5 结语

用C#实现文件共享 篇7

高职教学用的计算机实验室大多是公用的, 不同的时间段使用班级及教师有可能不一样, 承担的实验任务也不同。课间休息有限, 教师教学过程中不可避免地涉及到学作业的存取及文件共享问题。如何让教师在尽可能短的时间内将学生作业收集及清理完毕, 是实验室要考虑解决的问题。另外, 教学中难免要对学生进行测试, 防范学生通过学生机之间的网上邻居共享资源或即时通讯软件作弊, 也是实验室要解决的问题。相似的问题在中小学的信息技术教育教学中也同样存在[1], 且在企事业单位同样具有文件互传与共享的需求[2]。

为解决以上问题, 有的通过第三方软件, 有的通过编程实现[1,2]。很多学校采用多媒体教学软件实现教师文件发送及学生作业提交的方法, 学生作业的收取需要学生完成发送教师才能接收, 在短短的几分钟内往往完成不了任务。

用批处理实现快速共享, 其中用户账户没有设密码, 在学生端用批处理进行网络驱动器映射时, 需将学生机上对应的批处理拖动到“启动”菜单, 启动计算机后进行自动映射[3]。但此方法存在一个缺点:批处理保存在学生机硬盘上, 将批处理放到启动菜单中, 学生容易从启动菜单查到该批处理文件的位置, 并将其打开, 查看批处理的内容, 存在安全隐患。如果将批处理隐藏, 重启计算机则批处理不起作用, 无法与服务器自动连接。按常规方法在windows窗体中设置共享[4,5,6], 重新启动计算机又要求输入密码。我们改进了方案, 使共享更安全;在学生机端映射网络驱动器方法上作了一些调整, 重启系统可自动映射网络驱动器而不提示输入密码。

1解决方案

软件环境:服务器操作系统为Windows Server2003, 文件格式可为NTFS或FAT32, 学生机操作系统为Windows XPProfessional SP3。

(1) 不同的实验室使用不同的网段, 保证不同实验室的教学互不干扰。

(2) 服务器、学生机都安装双系统, 两个系统装在不同的分区上。一个系统平时教学使用, 一个系统测试学生时使用。

(3) 两个系统安装的软件基本一样, 考试用的系统不安装即时通讯软件, 如QQ等。

(4) 平时教学用的系统用批处理实现共享, 服务器上的用户账号不设密码。测试学生使用的系统服务器上的用户账号需设密码, 提高安全性。

下文仅介绍测试学生所用系统的实现过程, 重点介绍改动的部分, 其他部分参看参考文献[3]。

2实现过程

2.1服务器端的操作

下文中提到的服务器名为:server1, 地址为:192.168.4.1。服务器中建56个用户, 账号名分别为user1、user2……user56, 密码统一为【123456】。建两个文件夹, 其中一个名为【试题】, 共享名为原文件夹名、【Everyone】组或用户对其具有读取权限。另一个非共享的文件夹, 名为【考试文件夹】, 再在其中新建56个文件夹, 文件夹名分别为:1、2、3……56。将每个文件夹设为共享, 共享名为原文件夹名, 一个文件夹只分配给唯一对应的用户, 该用户对它具有完全控制的权限。1对应user1、2对应user2……56对应user56。学生机的主机名依次为C1、C2……C56, 映射网络驱动器时, 1对应用C1、2对应C2……56对应C56。

(1) 批量添加有密码的用户

建立与学生机数相同的用户数, 用命令net user完成:

net user [password ] [/ expires :never][ /passwordchg:no] [/add]

参数介绍如下:

username:自定义的用户名

password:自定义的密码。

expires:never:设置帐户永不过期。

passwordchg:no:指定用户不能改变自己的密码。

add:将新建用户添加到用户帐号数据库。

例:net user user1 123456 /expires:never /passwordchg:no /add

该语句建立一个名为user1, 密码为123456的用户, 此账户永不过期且用户不能更改密码。

为方便计算机实验室的管理, 我们为所有用户定义相同的密码。批处理中的语句条数与用户数一致, 只需改username就可以了。

(2) 设置【密码永不过期】

可在【计算机管理】窗口中设置, 但工作量大。我们采用命令进行设置:

将外部命 令NETUSER.EXE复制到文 件夹C :WINDOWSsystem32中。

netuser username /pwnexp:y

参数介绍如下:

username:是用户名

pwnexp:设置密码永不过期

可在第 (1) 步创建的批处理文件尾添加命令行, 减少批处理文件的数量。

在服务器端双击运行批处理文件, 就添加了相应的用户。查看用户属性, 看到“用户不能更改密码”及“密码永不过期”被选中。

(3) 创建文件夹及设置其属性

1在指定的驱动器根目录下建立文件夹“试题”。

2设置文件夹“试题”的属性

右击文件夹“试题”, 从快捷菜单中选择“安全和共享”, 设置其共享属性为“共享此文件”, 共享名可自定, 我们的共享名与文件夹相同。其它属性分别为:“允许最多用户”、“读取”、Everyone。

3建立【考试文件夹】

此文件夹的位置必需要放在不加保护的硬盘分区中。

4批量建立共享文件夹

用md命令创建批处理文件, 命令条数与学生机数一致。

md [drive:]path

[drive:]是驱动器名, path是路径。

例:md e:考试文件夹1

在E:盘“考试文件夹”中创建一个名称是“1”的文件夹。

4设置文件夹共享属性

用命令net share设置共享。

例:Net share 1=E:考试文件夹1 /grant:user1, full

其中, “=”号左边是文件夹的共享名, “=”号右边是文件夹的绝对路径。赋予用户user1访问权限为full。查看文件夹“1”属性中的共享权限, 用户user1对它有完全控制的权限。

(4) 组策略设置

保证组策略中“网络访问:本地账户的共享和安全模式”的安全设置为默认值“经典-本地用户以自己的身份验证”。

2.2客户端 (学生机) 的操作

以超级用户Administrator身份本地登录学生机, 为学生机映射网络驱动器。

在学生机设置两个映射动器, 一个用于学生存放文件, 另一个用于学生获取教师共享文件。服务器上的用户账号设置了密码, 我们尝试了两种方法为学生机映射网络驱动器, 下面分别给予介绍:

2.2.1用批处理实现映射网络驱动器

(1) 映射网络驱动器用于学生存放文件

用命令net use编写映射网络驱动器的命令:

net use or [“password”] [/user:username]

参数说明如下:

:映射网络驱动器名

:服务器IP地址

computer name:服务器的计算机名

sharename:共享名

password:登录账号的密码

username:登录服务器的账号

例:主机名为C1的学生机的批处理文件【1.bat】中命令: net use I:192.168.4.11 "123456" /user:"server1user1"

net use H:192.168.4.1试题 "123456" /user:"server1user1"

I:和H:是在学生机上显示的驱动的名称56台计算机统一, 具有可读写的文件夹映射为I:, 具有只读权限的文件夹映射为H:。192.168.4.1为服务器server1的IP地址, 也可将IP地址替换成服务器的计算机名。1为服务器中共享文件夹的共享名, 123456为密码, server1user1指定以user1用户账户登录到服务器server1。其它学生机上的批处理大同小异, 需要更改的是对应的共享受文件夹名及用户名即可。

(2) 双击运行编写好的批处理文件, 即可创建映射。

(3) 重命名网络驱动器的名称分别为I:和H:。

(4) 将存在硬盘上的批处理文件拖动到“开始”按钮的启动项。

用此方法映射的网络驱动器, 学生机重启后会自动连接, 不用再次输入密码。批处理文件存在硬盘上, 学生通过启动项可以查到批处理的内容, 存在安全隐患。

2.2.2通过编写C#代码映射网络驱动器

主要程序代码:

private bool ConD ir (string Name, string Path)

{

try

{

System.Diagnostics.ProvessS tartI nfopsi=newSystem.Diagnostics.ProcessS tartI nfo () ;

psi.FileN ame=@”cmd.exe”;

psi.Arguments=@”/c net use”+Name+””+Path+””;

psi.WindowS yle=System.Diagnostics.ProcessW indowS tyleH idden;

System.Diagnostics.Process.Start (psi) ;

return true;

}

catch (Exception ey)

{

return false;

}

}

2.2.3学生文件的收取及共享文件夹中内容的清除

(1) 学生文件的收取

学生文件的收取只需将“考试文件夹”复制粘贴到指定的地方即可。

(2) 清理【考试文件夹】中的学生数据

1建立【批量删除文件夹.bat】文件

rd [/s][/q][drive:]path

/s用于删除目录树。除目录本身外, 还将删除指定目录下的所有子文件夹和文件。/q为安静模式, 带/s删除目录树时不要求确认。

2删除共享文件夹

在学生机与服务器断开连接时运行“批量删除文件夹.bat”文件, 即可将学生文件夹删除。

3重新创建共享文件夹

运行批处理重新创建对应的文件夹, 即可将删除掉的文件夹重新创建, 且共享属性会自动恢复。

2.2.4禁止学生机间通过网上邻居访问

在每台学生机上运行“gpedit.msc”, 打开【组策略】窗口。展开【Windows设置】|【安全设置】|【本地策略】|【用户权利指派】, 右击【从网络访问此计算机】, 弹出【从网络访问此计算机属性】|【本地安全设置】|选中【Everyone】|【删除】|【确定】|【是】, 将安全设置中默认的用户组【everyone】删除, 达到禁止学生机之间通过网上邻居访问的目的。然后将组策略及注册表锁定, 防止学生私自修改。

3结束语

经过多年的实践, 用我们的方案实现文件共享, 安全简便。教学过程中让学生将文件存储在指定的网络驱动器上, 学生文件收取只需教师在服务器端复制一个文件夹就行了。中小学及大学的计算机公共实验室, 教师及学生的流动性大。此方法不需增加额外的代价, 简易、经济、实用, 对企事业单位也具有一定的实用价值。

摘要:对计算机公共实验室文件共享方法进行了研究, 实验室学生用机操作系统为Windows XP, 服务器操作系统为Windows 2003。通过批处理及C#编程实现在学生机上使用密码映射网络驱动器, 且重启系统后学生机与服务器自动连接不必再次输入密码。修改组策略禁止学生机之间的网上邻居共享, 提高安全性。学生文件直接存放在网络驱动器中, 教师只需在服务器上简单操作即可将学生作业收集及清理, 提高收集作业的效率。

关键词:文件共享,映射网络驱动器,自动连接

参考文献

[1]陈宇云.我的机房教学文件管理方案[J].信息技术教育.2005 (11) .

[2]陈力.点对点局域网文件共享系统的设计与实现[J].电脑知识与技术.2011 (4) .

[3]韦丽霜, 李雄, 韦涛, 等.用批处理实现简便快捷的机房文件共享存取方案[J].电脑知识与技术.2011 (3) .

[4]神龙工作室.新编Windows XP中文版入门与提高[M].人民邮电出版社.北京, 2007.8, 283-284.

[5]九州书源, 陈裕明, 梁蔚.一学就会魔法书玩转Windows XP[M].清华大学出版社.北京, 2007.4, 172-173.

C#调用动态链接探析 篇8

从Windows操作系统诞生之日起, 就使用动态链接库 (DLL) 来支持公共函数的调用, 区别于在编译时发生、直接把代码插入到程序EXE文件的静态链接。动态链接是指程序运行时才把自己需要的函数链接进来的代码调用方式, 也就是说只要在应用程序需要时, 才加载DLL到进程的虚拟空间, 成为调用进程的一部分。程序使用DLL的优点包括:一方面, 可以减少在磁盘和物理内存中加载的代码的重复量;另一方面, 也可以促进模块式程序开发和简化程序部署和安装。每种编程语言调用DLL的方法都不尽相同, 本文对用C#调用DLL的方法进行介绍。

1动态链接库 (DLL) 的基本分类

每种编程语言调用DLL的方法都不尽相同, 本文只对用C#调用DLL的方法进行分析总结。首先, 需要了解什么是托管, 什么是非托管。随着.net平台的引入, 代码分为托管代码和非托管代码, 托管代码由公共语言运行库环境 (而不是直接由操作系统) 执行的代码。托管代码应用程序可以获得公共语言运行库服务, 例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。非托管代码指在公共语言运行库环境的外部, 由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同, 后者从公共语言运行库中获得这些服务。对于动态链接库DLL来说也分为托管的DLL和非托管的DLL。

2非托管的DLL的C#调用

2.1对于不是基于com的非托管的DLL访问

首先, 应该在C#语言源程序中声明外部方法, 其基本形式是:

[DLLImport (“DLL文件”) ] //-访问DLL文件

修饰符 ReturnType FunctionName (type arg1, type arg2, ...) ;//--声明方法。

其中:DLL文件是包含定义外部方法的库文件。修饰符是除了abstract以外在声明方法时可以使用的修饰符, 一般为public static extern。返回变量类型是在DLL文件中需调用方法的返回变量类型。方法名称是在DLL文件中需调用方法的名称。参数列表是在DLL文件中需调用方法的列表。DllImport还包含了一些可选属性, 其中4个比较常用:

(1) EntryPoint 参数给出 DLL 中入口点的名称。如果未指定 EntryPoint, 则使用方法本身的名称。

(2) CharSet 参数指示用在入口点中的字符集。如果未指定 CharSet, 则使用默认值 CharSet.Auto。

(3) SetLastError 参数指示方法是否保留 Win32“上一错误”。如果未指定 SetLastError, 则使用默认值 false。

(4) CallingConvention 参数指示入口点的调用约定。如果未指定 CallingConvention, 则使用默认值 CallingConvention.Winapi。

在使用DllImpor时记得引用所在的命名空间System.Runtime.InteropServices, 同时对于不同类型实现的DLL引用的方法也不尽相同。

2.1.1 引用普通winapi中的方法和自己编写的类库中的普通函数方法

采用DllImport的方法直接导入, 如要调用Winapi中的MessageBoxA功能可以:

[DllImport ("user32.dll", EntryPoint="MessageBoxA") ]

static extern int MsgBox (int hWnd, string msg, string caption, int type)

其它参数采用默认值。如果是自己编写的DLL文件中的函数, 一要注意DLL文件所在的位置, 可以放在项目文件夹下的../bin/Debug/目录里或者放在系统目录C:/Windows/system32里;二要注意DLL文件中使用的参数调用方式。C和C++缺省调用方式是_cdecl?, 而系统默认的方式是CallingConvention.Winapi要改为CallingConvention.Cdecl。

2.1.2 引用类库中类的方法和属性

一种是要在C#中调用类库中类的方法, 通过静态方法导出C++中的方法, 在C#中创建同名的类来接受C++中静态的方法, 注意此时C++类中的方法编译后名称改变, 通过dumpbin命令来查看编译后的名称并进行映射;另一种是要在C#中调用类库中类的属性, 主要使用System.Runtime.InteropServices命名空间的Marshal 类的PtrToStructure方法实现DLL中类的创建, 通过创建的类来实现属性的访问。

2.2对于基于COM的非托管DLL的访问

对于非托管代码下基于COM的DLL, 可以先用tlbimp命令将COM类型中定义转换为公共运行时的等效定义。如:TlbImp test.dll /out: test_clr.dll, 在直接在C#项目中添加对test_clr.dll的引用。然后倒入对应的命名空间, 即可访问COM库的类中方法。如果使用 Visual Studio 开发环境, 则只需添加对COM类型库的引用, VS将为您自动完成此转换。

上面使用的TlbImp.exe (类型库导入程序) , 它是一个包括在 .NET 框架 SDK 中的命令行工具。TlbImp 将 COM 类型库转换为 .NET 框架元数据, 从而有效地创建一个可以从任何托管语言调用的托管包装。用 TlbImp 创建的 .NET 框架元数据可以通过 /R 编译器选项包括在 C# 内部版本中。

注意:在最新的VS2010中直接添加对COM类型库的引用并自动完成此转换后, 要修改DLL的文件引用属性的“嵌入式操作类型”, 由默认的true修改为false, 否则提示无法嵌入互操作类的错误。而在vs2005和vs2008中并无引用属性“嵌入式操作类型”。

3托管的DLL的C#调用

C# 调用托管DLL是很简单的, 只要在“解决方案资源管理器”中的需要调用DLL的项目下用鼠标右击“引用”, 并选择“添加引用”, 然后选择已列出的DLL或通过浏览来选择DLL文件, 最后需要用using 导入相关的命名空间。需要注意的问题也是vs2010中DLL文件引用属性的“嵌入式操作类型”, 也需要由默认的true修改为false。

3.1动态调用托管DLL

C# 动态调用托管DLL也需要借助System.Reflection.Assembly里的类和方法, 主要使用了Assembly.LoadFrom。假如在托管代码的命名空间Test中的Class1类中有Method方法, Method方法有一个int类型参数并返回int的值, 就是假设Method起一个简单的数据处理和返回的作用。编译生成托管的Test.dll文件。在C#项目中要动态引用该DLL, 先导入命名空间:using System.Reflection;在主函数中的调用代码大致如下:

4结语

使用DLL有很多优点, 如:节省内存和减少交换操作;开发大型程序时可以把某些模块分配给程序员, 程序员可以用任何一门所熟悉的语言把该模块编译成DLL文件, 这样可以提高代码的复用, 大大减轻程序员的工作量。所以, 如何灵活地调用DLL应该是每位程序员所熟知的。

本文重点对DLL进行了详细的分类, 对C#访问DLL的方法进行了综合和分析, 提出了调用中要注意的问题。笔者已经在多个项目中使用了上述的访问技术, 提高了工作效率, 缩短了研发周期。

参考文献

[1]潘爱民.COM原理与应用[M].北京:清华大学出版社, 2010.

[2]王小科.C#开发实战宝典[M].北京:清华大学出版社, 2010.

[3]郭新苍, 樊来耀.NET互操作技术研究[J].无线电工程, 2009 (6) .

C#中Unit结构详解 篇9

在c#中, 设置控件某个属性的长度时要用到结构unit, 例如, 可以将Web服务器控件的BorderWidth属性设置为表示5个像素的Unit。Unit结构表示长度度量, 它所属的命名空间是Syst em.Web.UI.WebControls, 表示可以用任何与HTML兼容的大小单位表示的长度度量, 和它联系比较密切的一个枚举是UnitType枚举, UnitType枚举列出可以表示的度量单位。

UnitType枚举成员如表一。

Unit结构有两个常用的属性, 一个是val ue属性, 通过Un it.Value属性获取Unit的长度, value属性值是double类型;另一个是type属性, 通过Unit..Type属性可以获取Unit的单位类型, 如Point类型。

2、使用Unit结构

通过下面这个例子给出Unit结构的用法:

在visual studio 2005中新建一个Asp.net网站, 打开default.aspx, 在页面中加入一个Button按钮button1, button1的text属性为“点我改变长度”button的初始长度为100px, 双击后进入事件处理程序:

以下所有代码均放在Button1的click事件处理程序中。

2.1 通过new关键字使用Unit结构

使用一个double或int值为参数, 指定长度值 (单位为像素)

格式:new Unit (double value) 或newUnit (int value)

例1:将button控件的BorderWidth属性设置为50个像素。代码如下:

Button1.BorderWidth=new Unit (50) ;//像素是默认的长度单位

需要注意的是Unit类只能表示不超过32767之间的值, 参数值也不能为负值。还有这里的BorderWidth是System.Web.UI WebControls.Unit类型, 可以通过如下代码测试:

Response.Write (Button 1.Width.GetType () .ToString () ) ;运行代码得到的结果就是:System.Web.UI.WebControls.Unit, 即然是unit结构类型, 可以观察一下Button1.BorderWidth的value和type属性, 通过如下代码测试:

例2:实现每次单击button让button的长度增加100px, 代码如下:

2.2 使用一个string类型值为参数, 该参数指定长度值或百分比

除了上述数值加单位这种形式外, 还可以用百分比的形式表示, 如下:

Button1.Width=new Unit ("50%") ;

上式价于Button1.Width=new (50, UnitType.Percentage) ;

2.3 使用两个参数同时指定长度值和单位, 数值是double类型

格式:new Unit (double value, Unittype.type)

如:Button1.Width=new Unit (50, UnitType.Pixel) ;

3、使用Unit静态方法设置控件的度量值

表二给出了Unit结构的静态方法。

说明:通过使用Parse、Percentage、Pixel和Point方法, 可以将其他数据类型转换为Unit。

3.1 Parse方法

功能:将字符串转换为Unit。

格式:Unit.Parse (string value) ;

例:将button1的width属性设置为50px

Button1.Width=Unit.Parse ("100") ;

3.2 Percentage方法

功能:从指定的双精度浮点数创建Percentage类型的Unit。

格式:Unit.Percentage (double value) ;

例:使button的长度为页面的90%, 代码如下:

Button1.Width=Unit.Percentage (90) ;

3.3 Pixel方法

功能:从指定的32位有符号整数创建Pixel类型的Unit。

格式:Unit.Pixel (int n)

例:设置button的宽度为200px, 代码如下:

Button1.Width=Unit.Pixel (200) ;

例:每次点击按钮使其宽度增加100px, 主要代码如下:

Button1.Width=Unit.Pixel (Convert.ToInt32 (Button1.Width.Value) +100) ;

在这里Button1.Width.Value是一个双精度浮点数字, 所以要使用C o n v e r t.ToInt32方法转换成int类型再参与运算。

3.4 point方法

功能:从指定的32位有符号整数创建Point类型的Unit。

格式:Unit.point (int n)

例:设置button的宽度为100个Point, 代码如下:

Button1.Width=Unit.Pixel (100) ;

摘要:Unit是c#中的一种结构类型, 也是c#中的一种度量类型, 该文从两个方面详细介绍了unit结构的使用, 一个是通过new关键字使用Unit结构, 另一个是使用Unit静态方法设置。

关键词:Unit结构,度量

参考文献

上一篇:消防无线通信系统下一篇:内涵意义和作用