C#高级编程教学大纲
《C#高级编程》教 学 大 纲
课程代码:59010822 开课学期:第一 学年第二 学期
适用专业:软件技术、计算机及应用技术 学 时: 108
编写教师:佘天明 学 分: 5
审 核: 杨振华
第一部分 说 明
-
课程的性质、作用
本课程是一门专业核心课程,Visual C#.NET是当前流行的功能强大的软件开发平台。.NET框架体系庞大、设计严密,能支持对各种类型的企业级应用程序的开发。本课程是针对软件工程等IT相关专业开设的专业选修课,主要讲授使用Visual C#.NET编制各类应用程序时必需掌握的若干高级编程技术和手段。能全面提升学生应用C#语言在.NET编程环境下的设计开发能力以及综合使用各种有效编程手段的能力。
本课程是一门理论和应用相结合的课程,要求学生在完成本课程的学习后,能利用C#进行高级程序设计。
-
课程的任务与基本要求
在现有的关于C#和.NET框架有关编程知识的基础上,进一步深入理解.NET框架和面向对象编程技术。掌握多线程编程、跨平台编程、程序集与反射、web services、网络Socket编程等Visual C#.NET的高级编程技术。熟悉使用Visual Studio .NET开发企业级应用程序的各种基本架构。能全面利用所学知识,开发应用系统。
-
教学方法建议
多用案例法教学,充分使用多媒体教学的方式。
-
本课程与其它课程的关系
本课程学习要求选修学生已具备一定的程设计基本知识和编程能力,最好学过C#编程课程,建议二年级以上学生选修。
-
本课程与专业核心技术、能力培养的关系及作用
第二部分 本 文
一、基本内容与学时分配
(一)NET Framework简介 6学时
理解 .NET Framework代码的编译、元数据和中间语言、程序集的加载和执行、垃圾回收技术
掌握委托和事件
重点:代码的编译和运行、元数据
难点:中间语言、元数据
(二)流与文件 12学时
掌握使用Stream类管理字节流,使用TextReader 、TextWriter类操纵读写文本
掌握对文件和文件夹的操作,使用FileSystemWatcher类监控文件系统
重点:对文件和文件夹的操作
难点:流与文件的区别
教学建议:认真分析源代码
(三)集合与泛型 12学时
数组、队列、栈
哈希表和有序表
泛型、自定义集合类
难点:自定义集合类
教学建议:与数据结构知识相结合
(四)多线程应用程序 12学时
掌握创建多线程应用程序
掌握使用ThreadPool类管理线程池
理解异步环境下的线程管理
了解应用程序域
重点:线程池
难点:线程间的同步
(五)程序集与反射 6学时
掌握程序集和Assembly类
了解反射和Type类
了解使用反射调用DLL中的方法
重点:调用DLL中的方法
难点:反射
(六)调用非托管代码 6学时
掌握使用process类调用非托管的 PE程序
掌握在.NET下调用非托管动态链接库,以及调用Windows API 的技术
了解在.NET下调用COM的技术
重点:调用Windows API
(七)处理 XML文档 12学时
掌握使用 XmlReader、XmlWriter类读写 XML文档
掌握使用XMLDocument类处理DOM 相关问题
理解使用XSLT 转换XML文档
了解XML 与DataSet等类的关系
了解XML序列化
重点:XMLDocument类
难点:XMLNode的属性和方法
(八)Web Services 编程 12学时
掌握Web Services的主要功能和特点、学会使用 Visual C# 进行 Web Services 编程
了解使用Web services实现信息集成
重点:Visual C# .NET IDE下实现Web Services
难点:SOAP等相关协议
教学建议:通过实例讲解
(九)基于Sockets模型的网络编程 18学时
掌握使用Sockets类编写网络应用程序(如简单聊天室)
理解异步通信方法和同步通信方法的区别
了解FTP、HTTP、SMTP等应用层协议的实现方法
重点:基于TCP的服务和客户端程序
难点:异步通信方法
(十)TCP/IP 通信应用层常用协议编 3学时
了解WebRequest及其相关类
了解在.NET 框架下实现FTP应用
了解使用WebClient类实现FTP文件操作
了解使用FtpWebRequest类实现FTP文件操作
(十一)应用系统的调试与配置 3学时
了解.NET应用系统的调试方法和系统的配置
(十二)资源文件、文本编码和区域性 3学时
了解在.NET应用 程序中使用资源文件、字符集、编码、文化、区域特性
(十三)Microsoft.NET框架的版本 3学时
了解,NET框架的各种版的特点
二、技术能力培养目标、措施、步骤
通过实验,要求学生掌相关知识,并能运用到实际的应用中,培养学生分析问题,解决问题的能力。所采取的措施,是加强学生动手能力和应用能力,通过从易到难,从简单到复杂逐步达到熟练的程度。
三、课程实验
(一)实验仪器设备、主要技术指标及配置要求
仪器设备名称 |
主要技术指标(或型号规格) |
配套数 |
备注 |
微型计算机 |
Windows 7、VS.NET 2012 |
1台/人 |
|
(二)实验项目一览表
序 号 |
实验名称 |
内容提要 |
实验 要 求 |
实验 类型 |
实验时数 |
每组 人数 |
所在实验室名称 |
备注 |
1 |
.NET框架基础 |
编译、垃圾回收、委托与事件 |
必做 |
综合 |
4 |
1 |
计算机实验中心402 |
|
2 |
文件操作 |
Stream类、文件和文件夹 |
必做 |
综合 |
4 |
1 |
计算机实验中心402 |
|
3 |
集合与泛型 |
集合、泛型 |
必做 |
验证 |
4 |
1 |
计算机实验中心402 |
|
4 |
多线程应用 |
多线程、线程池 |
必做 |
综合 |
4 |
1 |
计算机实验中心402 |
|
5 |
非托管代码 |
进程、DLL、API、COM |
必做 |
综合 |
6 |
1 |
计算机实验中心302 |
|
6 |
处理 XML文档 |
处理 XML文档、xmlDocument类 |
必做 |
综合 |
6 |
1 |
计算机实验中心402 |
|
7 |
Web Services |
Web Services,SOAP |
必做 |
综合 |
6 |
1 |
计算机实验中心402 |
|
8 |
Socket网络编程 |
聊天程序、TCP客户端 |
必做 |
综合 |
12 |
1 |
计算机实验中心402 |
|
-
综合性、设计性、研究创新性实验介绍
实验序号 实验名称
1 .NET框架基础(综合)
2 文件操作(综合)
3 集合与泛型(综合)
4 多线程应用(综合)
5 非托管代码(综合)
6 处理 XML文档(综合)
7 Web Services 编程(综合)
8 Socket网络编程(综合)
综合性实验: 实验内容涉及本课程的综合各识或与本课程相关课程多个知识点的实验,该类型实验是对学生进行实验技能和方法的综合训练。要求同学们要有综合运用知识的能力
验证性实验:由学生按照实验指导书的要求,在教师的指导下完成,通过实际操作加深对课堂所学理论知识的理解,掌基本的实验知识、实验方法和实验技能,处理实验数据,撰写实验报告。
创新实验:创新性实验是高等学校本科教学质量与教学改革工程的重要组成部分,其内容主要如下。目的任务:计划的实施,旨在探索并建立以问题和课题为核心的教学模式,倡导以本科学生为主体的创新性实验改革,调动学生的主动性、积极性和创造性,激发学生的创新思维和创新意识,逐渐掌握思考问题、解决问题的方法、提高其创新实践的能力。
实施目标:通过开展实施计划,带动广大的学生在本科阶段得到科学研究与发明创造的训练,改变目前高等教育培养过程中实践教学环节薄弱,动手能力不强的现状,改变灌输式的教学方法,推广研究性学习和个性化培养的教学方式,形成创新教育的氛围,建设创新文化,进一步推动高等教育教学改革,提高教学质量。
设计性实验:当学生经过一定数量的基础实验训练之后,有必要对学生进行具有科学实
验全过程性质的设计性实验的训练。科学实验的基本程序大体包括:选择课题、课题调研、
制定方案、实验过程、综合分析讨论和论文报告的撰写。
-
实验目的
通过实验教学培养学生的实践能力,使学生掌握基本.NET程序开发的一些较高级技术,能使用C#.NET编制各种类型的应用程序。要求学生具有较好的程序设计能力,熟练的使用开发环境。独立完成各个实验。实验中注重培养学生独立思考、独立动手设计的能力。
-
实验内容与基本要求
实验一
1. 尝试用命令行方式编译一个简单的控制台程序为可执行PE文件。
(1) 先用“记事本”编写一个简单的控制台应用程序p1.cs,该程序中只包含可供测试的几行简单代码,例如为:
using System;
using System.Threading;
class test
{
static void Main()
{
int x, y;
x=Int32.Parse(Console.ReadLine());
y=Int32.Parse(Console.ReadLine());
Console.WriteLine("{0}+{1}={2}",x, y, x+y);
Console.ReadLine();
}
}
(2) 使用C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe 程序(该路径为VS2005下适用,如果用更高版本时应相应调整)以及适当的参数执行编译命令。产生一个可执行PE程序。
(3) 执行该PE程序,观察是否符合预期。
(4) 观察用以上方法编译时,如果代码中有错误,系统如何输出错误信息?
2. 使用 GC类控制 .NET的垃圾回收操作。
(1) 按照教材上【例1-3】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察、记录控制台输出。
(3) 如果要使MakeSomeGarbage方法中产生的对象不会被回收,应该如何修改 MakeSomeGarbage中的代码?修改后实际运行时,观察程序输出的相关信息是否与预计一致(需要与修改前输出的内存占有数据相比较)。
3. 学习使用委托
(1) 按照教材上【例1-5】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察、记录控制台输出。
4. 不要利用Visual Studio.NET IDE环境的“工具箱”、“属性窗口”,最好只使用“笔记本”写代码,编写一个“Hello,World!”的Windows应用程序。
(1) 该Windows程序窗体上有一个按钮。当单击按钮时,弹出对话框显示“Hello,World!”。
(2) 在“命令行窗口”下执行CSC将C#代码文件编译为PE程序。
提示:
可在Form_Load等事件中执行 Button button1=new Button(); 创建该按钮,对该按钮,要将其加入到Form的Controls集合中。然后对按钮的Text、Position等属性赋值。最后记得要为单击按钮的事件设置一个方法:
this.button1.Click += new System.EventHandler(this.button1_Click);
详见教材上§1.5.2中有关叙述。
实验二
1. 使用StreamReader和StreamWrite类操纵文本文件。
(1) 按照教材上【例2-4】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察、记录控制台输出。(程序中使用的文件路径和名称可调整)
(3) 修改一下程序中代码,将ReadLine 方法替换为使用ReadToEnd方法,但仍然可以输出同样的结果。
2 使用 DirectoryInfo 类和 FileInfo 类,对文件系统进行操作。
(1) 按照教材上【例2-8】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察、记录控制台输出。(程序中使用的文件夹名称可以酌情调整)
(3) 修改或补充该程序,当指定一个文件夹后,程序可输出该文件夹及其各级子目录内所包含的文件的总数。
3. 使用DriveInfo类探测本机上各个驱动器。
(1) 按照教材上【例2-12】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察、记录控制台输出。
(3) 修改或补充该程序,使能找到本机上所有U盘中可用空间最大的那一个。
4. 使用FileSystemWatche类,监视C盘根目录上的各种文件操作。
(1) 按照教材上【例2-13】建立C#的控制台应用程序。
(2) 编译调试该程序,记录测试过程。
(3) 修改或补充该程序,使得文件改名操作不允许(或每次改名后总能自动改回去)。
实验三
1. 学习ArrayList的基本操作
(1) 按照教材上【例3-1】建立C#的控制台应用程序。
(2) 编译调试该程序,记录测试过程和运行结果。
(3) 尝试一下将两种不同类型的对象添加为同一个ArrayList中的元素。你认为是否可行?记录下实际运行的结果。
2. 学习Stack类的基本操作
(1) 按照教材上【例3-3】建立C#的控制台应用程序。
(2) 编译调试该程序,记录测试过程和运行结果。
(3) 修改一下本例的代码:将输出栈中所有元素的任务定义为一个方法。该方法应类似例3-3中的ShowValues那样,利用该集合中实现的IEnumerator接口的方法来工作。
3. 学习哈希表的基本操作
(1) 按照教材上【例3-4】建立C#的控制台应用程序。
(2) 编译调试该程序,记录测试过程和运行结果。
4. 学习Sortedlist的基本操作
(1) 参考教材上【例3-5】,使用Sortedlist编写一个简单的数据查找程序。
(2) 新建Windows Form应用程序,在程序中加入一个Sortedlist对象。窗体上放三个按钮、两个文本框和一个列表框。三个按钮的Text分别为“添加”、“查找”、“列表”。
(3) 在第一个文本框中输入英文单词,在另一个文本框中输入中文解释,然后单击“添加”按钮即添加该“键、值对”到Sortedlist集合内。
(4) 在第一个文本框中输入英文单词后,单击“查找”按钮进行按“键”的查找。当找到该项后,在第二个文本框内显示其中文释义。如果找不到,则弹出一个“该项未找到!”的信息框。
(5) 单击“列表”按钮,在列表框中显示该Sortedlist的所有元素。注意观察它们是否已经都排好序了。
5. 使用泛型
(1) 按照教材上【例3-9】 建立C#的控制台应用程序。
(2) 编译调试该程序,分析运行时输出的数据,看它是否符合栈“后进先出”的基本要求。
(3) 修改或补充该程序,使得对上述程序中使用的类型为Stack<string>。然后再运行,并比较与此前程序运行时有什么区别。
6. 自定义集合类型
(1) 按照教材上【例3-10】建立C#的控制台应用程序。
(2) 编译调试该程序,记录测试过程和运行结果。
(3) 尝试将本例中public Contractor this[int Index] 方法注释掉后再进行编译,看看是否会影响在自定义集合中使用索引器(即像访问数组元素那样去访问集合的元素)。
(4) 尝试为本例中自定义的集合类型添加一个Remove或RemoveAt方法用于删除元素。
实验四
1. 使用Thread类,创建多线程应用程序
(1) 按照教材上【例4-1】 建立C#的控制台应用程序。
(2) 编译调试该程序,根据运行时输出的数据,分析这些线程如何并发运行。
(3) 修改或补充该程序,适当增加线程的数目以及每个线程中循环执行的次数。或者改变Sleep的参数。然后再运行,并比较与此前程序运行时有什么区别。如果发现有规律性的东西,请在实验报告中给予解释。
(4) 修改或补充该程序,适当增加线程的数目以及每个线程中循环执行的次数。或者改变Sleep的参数,并降低第一个线程的优先级并提高最后一个线程的优先级。然后再运行,观察其输出。看看能否使第一个线程比最后一个线程结束得更晚。
2. 使用 ThreadPool类对线程池进行管理。
(1) 按照教材上【例4-3】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察、记录和分析其输出,从中获得线程池中同时在运行的线程的最大数目。注意:由于控制台输出缓存有限,可以用“>”操作将输出重定向到一个文件(例如C:\>ConsoleApplication1.exe > C:\output.txt)。
(3) 思考以下问题:如果将程序中 Thread.Sleep(50) 语句中的参数值改为较小值,线程池中同时运行的线程数是增加还是减少? 建议通过实际修改程序去测试一下自己的判断是否正确。
(4) 思考以下问题:通过修改程序使程序自动检测运行过程中线程池内最多同时运行的线程的数目并输出该数值。
3. 使用Thread类的Join方法对线程进行控制 。
(1) 按照教材上【例4-4】,建立C#的控制台应用程序。
(2) 编译调试该程序,观察和记录控制台输出。注意应能正确解释这个输出结果。
4. 使用 AutoResetEvent类对象对线程进行控制。
(1) 按照教材上【例4-5】, 建立C#的控制台应用程序。
(2) 编译调试该程序,观察和记录控制台输出。注意应能正确解释这个输出结果。
5. 线程同步技术综合应用。
(1) 请参考【例4-4】、【例4-5】等例题,建立C#的控制台应用程序。
(2) 该程序应完成子任务A、B、C、D、E、F、G。这些子任务之间存在的前趋关系如图1所示。
(3) 为了提高运行效率,要求该程序使用多线程技术,除主线程外,另加入一至二个分线程(允许使用线程池)。这些多线程之间需要进行适当同步性控制,以满足图1中规定的关系。请在程序中适当使用Thread类的Join方法或AutoResetEvent类对象WaitOne方法解决这里的同步性要求。并且当用Join方法能解决问题时就不用WaitOne或少用WaitOne方法。注:为了突出重点,可将子任务A、B、C、D、E、F、G分别以简单输出语句代替,如Console.WriteLine(“A”);等。
图1
实验五
1. 使用Process 和ProcessStartInfo类,调用非托管PE应用程序并进行初始运行环境的设置。
(1) 按照教材上【例6-2】, 建立控制台应用程序(程序中用到的网页可以自己随便找一个或编一个)。
(2) 编译调试该程序,观察、记录其输出并作出解释。(如果在win7下运行,可能需要以管理员权限执行程序才能获得期望的效果)。
2. 调用非托管的DLL动态链接库程序中的方法。
(1) 按照教材上【例6-3】, 建立控制台应用程序。
(2) 编译调试该程序,观察、记录其输出并作出解释。
3. 调用Windows API函数
(1) 按照教材上【例6-4】, 建立Windows Form应用程序。
(2) 编译调试该程序,观察、记录其输出并作出解释。
(3) 还有一个比FindWindow功能更强大API是FindWindowEx,它除了可以查找顶级窗口外,可以获得子窗口的句柄。有兴趣自己去网上查一下,然后尝试做一点测试。
4. 调用Windows API函数处理窗口消息。
(1) 按照教材上【例6-5】, 建立控制台应用程序。
(2) 编译调试该程序,观察、记录其输出并作出解释。
(3) 尝试一下修改该程序,例如将本例中的0x0010消息换成其他windows消息,然后观察运行时出现仕么情况。最好尝试一下有使用到LPARAM和WPARAM参数的消息。
5. 在.NET项目中调用Word
(1) 参照教材中的【例6-8】,建立Windows Form应用程序。本例中使用的“模板”(KTBG.doc)可以下载。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 尝试自定义一个模板,并按本例的原理进行自动数据替换达到自动产生表格的效果。并可尝试按照数据库表中的数据填写一批表格(数据库表的每一条记录对应一个表格)。实验中可利用Access数据库“工资.mdb”中的数据(可下载)。
6. 在.NET项目中调用Excel
(1) 按照教材上【例6-9】, 建立Windows Form应用程序。
(2) 编译调试该程序,观察、记录其输出并作出解释。
(3) 尝试一下通过程序自动将某个Access数据库表所有记录的数据填入到Excel电子表中。实验中可利用“工资.mdb”中的数据(可下载)。
实验六
1. 使用XMLReader类。
(1) 参照教材上【例7-1】,用XMLReader的对象读取XML文件。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 尝试用不同的XML文档,在该程序下进行显示。了解不同XML元素在程序下是如何显示的。
(4) 尝试对XML稍加修改,使程序中可以读到XML元素的属性。
(5) 尝试对XML稍加修改,观察当出现某些非规范的XML元素时程序是否出现异常。
2. 使用XMLWriter类。
(1) 参照教材上【例7-2】,使用XMLWriter的对象编写XML文件。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 尝试修改该程序,实现将数据库表的所有记录写入到XML。(可任意选用一个数据库,例如从服务器下载的“工资.mdb”)
3. 使用XmlDocument类。
(1) 参照教材上【例7-3】,使用XmlDocument的对象处理XML。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 尝试修改该程序,例如可在本例使用的XML中删除一个book元素。
5. XML序列化问题。
(1) 参照教材上【例7-7】,使用XmlSerializer类的对象处理XML序列化和反序列化。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 修改该程序,尝试将其它类型的对象实现序列化。
实验七
1. 使用Web服务。
(1) 参照教材上【例8-3】,应用 Web服务实现信息系统的集成。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 尝试对该服务端程序进行适当的部署,提供给周围同学通过机房局域网访问该Web服务。
2. 在Web服务中进行数据库操作。
(1) 参照教材上【例8-4】,应用 Web服务实现数据库操作。本题所需access数据库文件“工资.mdb”可从服务器下载。
(2) 编译调试该程序,观察、记录其运行过程。
(3) 尝试修改该程序,实现数据记录查询、删除、更新等各项功能(实现删除较容易)。
实验八
1. 简单网络聊天。
(1) 参照教材上例10-1,编写该程序并完成调试。
(2) 调试运行时可以尝试相邻机位的同学间用该程序进行聊天。
(3) 按各种方式多次执行服务器和客户端,仔细观察程序的表现;对该程序找“毛病”,
对这些毛病产生的原因进行分析,指出可能的解决方案,并写入实验报告。
2. 同步与异步通信方法
(1) 参照教材上例10-2,改编一个部分使用异步通信的聊天程序。
(2) 对该程序调试,仔细比较是否比原来未使用异步通信方法时有所改善。
(3) 尝试在本程序中进一步修改,对其中receive方法也改用相应的异步通信方法,此举可避免在该程序中使用多线程(可节省资源),同时不降低功能和响应速度。BeginReceive和EndReceive异步通信方法可参考MSDN文档。
3. 通用TCP客户端
(1) 参照教材上例10-3,编写该程序并完成调试。
(2) 对该程序调试,可参照教材上所述步骤,分别作为FTP和HTTP客户端测试本机上的FTP和HTTP(Web)服务。
(3) 用该程序测试较复杂的FTP服务器功能,如下载文档和文件目录列清单。相关命令可参考教材中表12-6,注意其中部分命令需要先建立与服务器的“数据连接”。
四、习题与作业
五、课程考核形式与成绩评定
1.实训后,学生将按要求写成实训报告文档,符合实训教学的要求并得到指导教师的认可。
2. 指导教师对实训报告进行批改、评分。
3. 采用操作考试考核方式。
4. 由于该门实训课程依附于理论课,课程总成绩应为实训与理论的综合,其中实训课
程成绩计入总成绩,占30%,理论课成绩占70%。