Dear all;
結合下自己認識,并查閱了一些幫助文檔,介紹一點.Net平臺運行機制和概念,目前寫出了一部分,還有部分,下次再補充。
微软的.NET战略,微软首席执行官鲍尔默:“Microsoft.NET代表了一个集合、一个环境、一个可以作为平台支持下一代Internet的可编程框架。”
微软主席比尔.盖茨:“软件将使一切成为可能”。 这种向.NET平台的迁移是和“从DOS到Windows迁移”一样意义重大。
NET平台是“语言中立的”,目前支持20多种编程语言,遵循公共语言规范CLS
微软提供:VB.NET, C++.NET, C#.NET, J#.NET
第三方提供:APL, COBOL, Pascal, Eiffel, Haskell, ML, Oberon, Perl, Python, Scheme, Smalltalk…
一..Net 平臺的架構
====è
公共语言运行库 CLR的工作目的:
1.CLR负责管理和执行.NET框架代码
2.CLR在.NET平台中充当一个类似于代理人的角色,负责底层统一的进程/线程管理(如线程安全)、内存管理(如垃圾收集)、安全管理、代码验证、编译以及其他的系统服务
3.CLR通过中间语言机制实现 .NET的编程语言无关性,此外也为.NET Framework带来潜在的平台无关性
二.Net 程序執行的過程
上面右圖介紹了.Net 程序的執行過程,當使用VS工具等SDK開發工具進行.Net程序開發時,進過編譯生成的Bin文件,基本上文件格式有Exe和Dll兩種。這種文件是一種被Microsoft成為中間語言的文件.
中間語言IL,英文全稱為Intermediate Language,這是種對內存堆棧基本操作的代碼,使用.Net SDK的MSIL Disassembler Tool可查看到一些編譯後的IL代碼。對一些喜歡或比較關心底層操作的人員比較有用。
當我們執行這種Exe或Dll文件的時候,如果系統有安裝.Net環境平臺,CLR將負責整個管理和執行整個.Net代碼。它會將程序所會使用到的.Net類庫文件,通過類加載器,加載到內存中, 然後通過JIT(即時編譯器)
將這個MSIL代碼編譯成計算機可以識別的機器碼,這種機器碼,將根據計算機CPU的不同將有所不同。
三..Net內存管理和垃圾回收機制
1.手工的内存管理常见问题:
w 忘记释放内存 ---- 内存泄露
w 意外访问已释放内存 --- 游离指针
2.NET CLR提供了自动的内存管理
w 内存的申请和释放自动由CLR负责,程序员轻松
w 减少了错误和bug的出现
一般情況下,我們不需要對內存進行直接的操作,上面表格1中介紹手工操作的弊端,基於此在.Net平臺中Microsoft提出了內存自動管理的機制,實現的內存的申請和釋放的自動原則,減少錯誤的潛在的Bug的出現。
垃圾回收器跟踪并回收托管内存中分配的对象。垃圾回收器定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,垃圾回收会自动进行。比如在一些使用引用的對象,如果
此引用的對象,一段時間后沒有引對象用的使用,CLR將進行來及回收處理,及時釋放內存,而這就是我們人工會忽略的地方。但有時并不是完全要放手自動實現的,比如有個對象可能只是暫時的沒有對象的引用,而并
不想及時釋放掉,如果放手讓垃圾回收機制看來處理內存,將造成一些多餘的操作,這時就可以使用System.GC.SuppressFinalize()方法抑制垃圾回收器,不讓其進行回收,在.Net類庫中,System命名空間下的GC類,將
控制系统垃圾回收器(一种自动回收未使用内存的服务)。這是一個Static類,此类中的方法影响何时对对象进行垃圾回收以及何时释放对象所分配的资源。类中的属性提供以下信息:系统可用内存总量、分配给对象的
内存的周期类别(代)。比如可以使用应用程序可以使用 System.GC.
Collect()方法强制进行垃圾回收。用 C# 或 C++ 编写的类型实现析构函数,由编译器将析构函数转换为对
Object.Finalize() 的重写, 多数情况下,如果某
对象有终结器,则垃圾回收器会在释放该对象前调用其终结器。类可以实现
IDisposable 接口,该接口包含执行资源管理和清理任务的
IDisposable.Dispose 方法。实现
Dispose 的类作为它们的类协定的一部分,必须
指定类使用者是否需要及在什么时候调用该方法来清理对象。默认情况下,垃圾回收器并不调用
Dispose 方法,然而
Dispose 方法的实现可以调用GC 类中的方法来自定义垃圾回收器的完成行为。
四..Net類庫的介紹
不同的编程语言所提供的API或类库存在很大差异,选择一种编程语言意味着程序员必须学习该语言所提供的类型、结构、类库、函数等等。.Net 類庫,從最早2002年開始的1.0 ,1.1到2005年發布的 2.0,3.0,3.5,
3.5SP1以及最新的預發布的4.0.可以說從1.1到 2.0的變化是.Net逐漸強大的一個轉折點。2.0的類庫中淘汰了1.0中的一些不常用的了類庫,并增加了大量的新的類庫,比如泛型,匿名方法,可空類型,迭代器,部分類Partial,
以及大量控件類庫,3.0和3.5增加了Linq語言集成查詢功能,Lambda表達式,以及擴展方法。
System命名空間是最根層的命名空間,其下面有System.CodeDom,System.Collections,System.ComponentModel,Sytem.Configuration,System.Data等,現如下圖介紹;
下面將簡單介紹下每個命名空間的作用;
System.CodeDom 命名空间包含可以用于表示源代码文档的元素和结构的类。此命名空间中的类可用来建立源代码文档结构的模型,使用
System.CodeDom.Compiler 命名空间提供的功能可以将源代码文档输出为所支持语言的源代码。
System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
System.ComponentModel 命名空间提供用于实现组件和控件运行时和设计时行为的类。此命名空间包括用于实现属性和类型转换器、绑定到数据源以及授权组件的基类和接口。
System.Configuration 命名空间包含提供用于处理配置数据的编程模型的类型。.NET Framework 3.5 版中引入了 System.Configuration。
System.Data 命名空间提供对表示 ADO.NET 结构的类的访问。通过 ADO.NET 可以生成一些组件,用于有效管理多个数据源的数据。常見的Dataset,以及數據庫操作的類在此命名空間。
System.Deployment 命名空間提供一些與程序發布有關的類。
System.Diagnostics 命名空间提供特定的类,使您能够与系统进程Process、事件日志Eventlog和性能计数器Counter进行交互。
System.Drawing 命名空间提供了对 GDI+ 基本图形功能的访问。在
System.Drawing.Drawing2D、
System.Drawing.Imaging 以及
System.Drawing.Text 命名空间中提供了更高级的功能。
System.EnterpriseServices 命名空间为企业应用程序提供重要的基础结构。COM+ 为企业环境中部署的组件编程模型提供服务结构。该命名空间向 .NET 对象提供对 COM+ 服务的访问,COM+ 服务令 .NET Framework 对象更适用于企业应用程序。
System.Globalization 命名空间包含定义区域性相关信息的类,这些信息包括语言、国家/地区、使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。我们可以使用这些类编写全球化(国际化)应用程序。而像 StringInfo 和 TextInfo 这样的类更是为我们提供了诸如代理项支持和文本元素处理等高级全球化功能。
System.IdentityModel 命名空間包含System.Globalization和System.IdentityModel.Policy以及System.IdentityModel.Selectors命名空间,第一個命名空间包含定义区域性相关信息的类,这些信息包括语言、国家/地区、使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。我们可以使用这些类编写全球化(国际化)应用程序。而像 StringInfo 和 TextInfo 这样的类更是为我们提供了诸如代理项支持和文本元素处理等高级全球化功能。System.IdentityModel.Policy 命名空间,包含在 WCF 中构建或使用授权策略所需的类和接口。实现授权策略的类可以实现 IAuthorizationPolicy 接口。一个授权策略。此命名空间中其他重要的类包括 AuthorizationContext 和 EvaluationContext。最後一個命名空間包含包含一些类,这些类可用来为传出 SOAP 消息提供安全令牌,并可对传入 SOAP 消息中的安全令牌进行身份验证。
System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。
System.Media 命名空间包含用于播放声音文件和访问系统提供的声音的类。
System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口。常見Socket編程,簡易DNS類。IPAddress類,還包括System.Net.Mail 命名空间發送有的郵件的常見類。
S System.Reflection 命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。
System.Resources 命名空间提供各种类和接口,这些类和接口使开发人员可以创建、存储和管理在应用程序中使用的不同特定于区域性的资源。System.Resources 命名空间最重要的类之一是 ResourceManager 类。ResourceManager 类使用户可以访问和控制在主程序集或在资源附属程序集中存储的资源。使用 ResourceManagerGetObject() 和 ResourceManagerGetString() 方法检索特定于区域性的对象和字符串。
System.Runtime 命名空间包含支持不同命名空间(如
System、Runtime 命名空间和 Security 命名空间)的高级类型。此空間包含System.Runtime.InteropServices 命名空间,其提供各种各样支持 COM interop 及平台调用服务的成员。
System.Security 命名空间提供公共语言运行库安全系统的基础结构,包括权限的基类。常見的一些加密解密算法由此空間提供。
System.ServiceModel 命名空间包含生成 Windows Communication Foundation (WCF) 服务和客户端应用程序所需的类、枚举和接口,这些类、枚举和接口可用于生成大范围的分布式应用程序。 此空間3.0以上的版本才會有。
System.Text 命名空间包含表示 ASCII、Unicode、UTF-7 和 UTF-8 字符编码的类;用于将字符块转换为字节块和将字节块转换为字符块的抽象基类;以及操作和格式化 String 对象而不创建 String 的中间实例的 Helper 类。StringBuilder在此空間。
System.Threading 命名空间提供一些使得可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked、AutoResetEvent 等)外,此命名空间还包含一个 ThreadPool 类(它允许用户使用系统提供的线程池)和一个 Timer 类(它在线程池线程上执行回调方法)。
System.Timers 命名空间提供 Timer 组件,它使您可以指定的间隔引发事件。
System.Web 命名空间提供使得可以进行浏览器与服务器通信的类和接口。此命名空间包括 HttpRequest 类(用于提供有关当前 HTTP 请求的广泛信息)、HttpResponse 类(用于管理对客户端的 HTTP 输出)以及 HttpServerUtility 类(用于提供对服务器端实用工具与进程的访问)。System.Web 还包括用于 Cookie 操作、文件传输、异常信息和输出缓存控制的类。現在我們進行的Web系統的很多控件都是基於此命名空間的。
System.Windows 命名空间,提供了一些重要的 Windows Presentation Foundation (WPF) 基元素类、各种支持 WPF 属性系统和事件逻辑的类以及由 WPF 核心和框架更加广泛使用的其他类型。常見的Windows Form 編程就是基於此命名空間下,System.Windows.Forms 命名空间包含用于创建基于 Windows 的应用程序的类,以充分利用 Microsoft Windows 操作系统中提供的丰富的用户界面功能。
System.Xml 命名空间为处理 XML 提供基于标准的支持。.Net 3.0增加的Linq功能,使用System.Xml.Linq 命名空间中的類庫,支持的标准包括:
· XML 1.0 - http://www.w3.org/TR/1998/REC-xml-19980210 - 包括 DTD 支持。
· XML 命名空间 - http://www.w3.org/TR/REC-xml-names/ - 流级别和 DOM。
· XSD 架构 - http://www.w3.org/2001/XMLSchema
· XPath 表达式 - http://www.w3.org/TR/xpath
· XSLT 转换 - http://www.w3.org/TR/xslt
· DOM 级别 1 核心 - http://www.w3.org/TR/REC-DOM-Level-1/
· DOM 级别 2 核心 - http://www.w3.org/TR/DOM-Level-2
以上是是目前.Net 類庫中的一些常見的命名空間,只是簡單的介紹下大致的用途,詳情請參閱MSDN,這是個比較好的官方Help文檔。
五.其他類庫和非托管資源的使用
.NET Framework实现了应用程序开发的“通用性”,所有的编程语言均使用统一的基础类库一致性大大提高了软件开发的效率和生产率,并可以节省由于语言差异而对程序员培训的费用。但是類庫也是有其具局限性的,
目前使用Windows API 庫,進行基於Windows的編程,是一直比較熱的方向,很多開發語言都會使用到,比如C++中使用其進行MFC編程,同樣在使用c#或VB.net進行編程的時候,也是可以導入Windows API庫進行編
程的,使用System.Runtime.InteropServices 命名空间下的DllimportAttribute類,該類指示该属性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。使用舉例如下:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
上例導入了User32.dll文件里封裝的MessageBox函數,將其最為非托管資源使用。當然不只是可以導入Microsoft的API,同樣也可以是其他廠商提供的API類庫。甚至一些API類庫,也可以在項目中通過”Add”功能添加。
使用時Using 其命名空間即可。
六.Socket網絡編程==》後續介紹
七.文件IO操作==》後續介紹
八.注冊表操作==》後續介紹
九.XML文件操作==》後續介紹
十.線程Threading操作==》後續介紹
十一.數據庫操作==》後續介紹
十二.GDI+繪圖操作==》後續介紹
十三.委托Delegate和事件Event==》後續介紹
十四.設計模式(Design Pattern)之簡單工廠模式(factory pattern) ==》後續介紹
十五.泛型(Generic Type) ==》後續介紹
十六 Class類的修飾詞(Modifier)
常見的類修飾詞有Public,Private,interal,protected四個,修飾其成員屬性和方法的將在原來的基礎上增加一種Protected internal。默認情況class 和結構的訪問權限是內部的,默認情況下,
如下在方法和屬性前不加訪問權限修飾詞,其訪問權限默認是private 的。接口的修飾詞默認是內部訪問級別,其成員都是public的,包括屬性,方法,索引器。
十七 集合(數組Array) ==》後續介紹
十八 裝箱(Boxing)與拆箱(Unboxing) ==》後續介紹
十九 反射(Reflection) ==》後續介紹
二十. IIS5.0,IIS6.0,IIS7.0運行機制==》後續介紹
廿一. ASP.Net 的工作原理==》後續介紹
廿二. 頁面的生命周期(Page’s Life Cycle) ==》後續介紹
廿三 控件的生命周期(Control ‘s Life Cycle) ==》後續介紹
廿四. 了解WPF,WCF,WFF,WF,.Net Remoting, WebService以及 Microsoft MVC開發模式
WCF: Windows Contribution Foundation Windows 分布式編程模板
WPF: Windows Presentation Foundation windows表現型模板 目前Vista 和Win7中的一些Microsoft 程式,一直在使用這種方式創建,其界面比較絢
WWF: Windows Work Flow Windows工作流
WSDL:WebService Dynamical Link Web服務動態連接
.Net Remoting: Url 路由
MVC開發模式:Model View Controler
廿五 .字符編碼的一些知識ASCII ,Unicode
當計算機剛發明的時候,美國人站在自身的角度,對字符編碼,發明了ASCII編碼,它使用7bit存儲字符,於是只能存儲2的7次方減1即是127個字符,詳細如下:
0~31 代表控制字符,如
32 空格space
33~47 常用字符,如#,*等
48~57 數字,如 1,2,3等
58~64 一些符號,如>,=,@等
65~90 大寫字母,如A,B等
91~96 符號,如[, ], ^等
97~122 小寫字母,如a,b等
122~127 符號,如{,},~等
因只能存儲127個字符,顯然後續對於逐漸擴展的字符是不夠的,之後產生了一個ISO 8859編碼標準,采用八位存儲字符,可存儲255個字符,兼容原來字符的基礎上,擴展了128~255個字符
0~127兼容ASCII
128~159 保留
160 空格 Space
161~255 新增字符
但是隨著計算機在中國,日本,韓國等Asia亞語系國家,上面的編碼方式就暴露出能力不足的問題,因為僅中文的漢字就2萬多個,對此我們國家自己創建了一系列簡體編碼比如GB2312(可存儲6768個漢字),GBK(21003),等,
對於繁體的漢字,Big5標準,還有些繁體香港,繁體澳門的編碼,同樣對於西歐的國家,也有各自的標準。這樣的結果就是導致編碼方式的多樣化,嚴重的結果將導致文化交流困難性,不利於軟件的全球化發展。為此國際化組織
有開發了一種編碼方式Unicode編碼。采用2個字節16bit存儲數據。其將存儲650065個字符,完全滿足各種國家字符的使用,但是很多以前開發的程序和目前使用表廣泛的程序使用的是1個字節的存儲方式,因此爲了兼容以前的
1個字節編碼方式,又推出了UTF(Unicode Transform Format傳輸格式碼)編碼。但是它又分UTF-32,UTF-16,UTF-8,UTF-7。对于所有编码,内部 .NET Framework 字符串都是本机 UTF-16 字符串。
PS:Unicode中文編碼的其實範圍是”/u4e00~/9fa5”,這是個小常識,可以在以後的開發中驗證,是否輸入的是中文。
廿六 單元測試的常見工具NUnit.exe和TDD(Test Driver Develop)測試驅動開發
開發一個系統,或軟件以及甚至一個dll插件,之後最終要的是測試,測試分很多種,比如單元測試,系統測試,集成測試,用戶測試,WEB测试与负载测试等。甚至有些專家提出,當需求分析進行后,先進性測試代碼的編寫,
可見測試的重要性,測試進行的好壞,將決定系統後續維護健壯性,甚至影響著用戶的市場。在這些測試當中,單元測試是首當其沖的,NUnit工具是使用.Net開發的進行單元測試的工具,它通過編寫一些測試代碼來對,來對一些
類庫文件進行測試,它來源自鼎鼎有名的XUnit家族,功能同進行Java代碼測試的JUnit,以及针对C++的CPPUnit,它的下载地址是:http://www.nunit.org. 目前的版本是NUnit-2.5.2.9222。单元测试看上去虽然有点麻烦,但是它为程序
员提供了一个安全的观点,让程序员对自己的程序更加有信心,在减少开发后期进行频繁Debug所耗费时间的同时也为应用软件提供了第一道安全防护网,因此,单元测试是提高开发效率和软件品质的一个重要的手段。利用UNint,
我们可以在.Net编程过程中非常方便的进行单元测试,它图形化的界面和简单而强大的测试框架为我们提供了一个非常舒适而有趣的测试环境,能够让程序员觉得进行单元测试并不枯燥乏味,习惯后甚至还能成为一种乐趣。
NUnit是個可以圖形操作GUI的工具,免費的,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等,最重要的一点是它适合于所有.NET语言。 NUnit虽然在使用上非常简单,赢得了一部分用户,
甚至于微软在企业库的源码中也提供了使用NUnit测试的版本,但是NUnit让人最不爽的地方是没有提供Visual Studio IDE插件,这样如果做单元测试,会发现自己每天忙于奔波于IDE和NUnit GUI之间,不停的在切换窗口;还有一点
NUnit虽然跟JUnit是兄弟,但是它的威望和能力相较Junit就差远了,尤其是扩展能力。基於此原因,介绍另一款优秀的单元测试工具——TestDriven.NET 2.0。它是以插件的形式集成在Visual Studio.NET IDE中的单元测试工具,能够兼
容各种Visual Studio版本,并且集成了多种单元测试框架诸如NUnit,MbUnit,以及Visual Studio Team System适配器等。TestDriven.NET的前身是NUnitAddIn,由Jamie Cansdale大师开发,一开始作者只是想做一个NUnit插件集成到
Visual Studio中,经过多次版本更新,NUnitAddIn在2004年9月底更名为TestDriven.NET,并在当年的12月初发布了它的第一个Release版本,即TestDriven.NET 1.0。由于它在开发中的出色表现,让很多开发人员期待它的下一个版本
的发布,这一等待却足足等了两年,在今年的10月底,终于迎来了姗姗来迟的TestDriven.NET 2.0版本。然而这一等待却是值得的,在2.0中,给我们带来了太多的惊喜,它集成了.NET Reflector、NConver、NConverExplorer、
TypeMock.NET等,功能更加强大。安装完TestDriven.NET 2.0 后,重新启动Visual Studio tools,可以发现在Visual Studio.NET IDE的右键菜单中会多出一些新项,所有的操作都是直接通过这些右键菜单来完成。当然对于
TestDriven.NET 2.0它的专业版和开发版已经开始收费,只有个人版仍然可以免费下载使用。有关TestDriven.NET 2.0的详细信息请访问:
http://www.testdriven.net/ 。值得提出的是如果要正常使用TestDriven.NET 2.0 需要添加
nunit.framework.dll文件,此文件在安裝NUnit時默認在將C:/Program Files/NUnit 2.5.2/bin/net-2.0/framework文件路徑下。
廿七 一款反編譯工具Reflector.exe (目前隨著.Net版本的更新依然在更新中) Author: Red Gate’s
NET Reflector是一个.NET平台下的类浏览器和反编译工具,我们可以用它来浏览程序集的类和方法,可以分析由这些类和方法生成的中间语言 (MSIL),目前版本是.NET Reflector 5.0,可通過其Reflector.FileDisassembler.dll插件分解原
文件,看到其源碼,對分析別人源碼,有大的好處。
廿八 一些小概念
Static 關鍵字可以修飾類,可以修飾字段,屬性,方法。
1》靜態類和靜態成員:
1.使用static修飾的類是靜態類,其成員全靜態的,密封不能被繼承,可以有靜態的構造函數。
2.靜態成員:在第一次被訪問之前,並且在任何靜態構造函數之前被初始化。靜態構造函數,也是進行初始化工作,無訪問修飾詞。
2》構造函數默認是Public 的,但是也可以是Static和private的,如果是private 其目的是阻止被實例化。
堆(Heap)和棧(Stack)的概念: 前者是由編譯器自動編譯和釋放的,後者是程序員分別和釋放的。
3》線程和進程
前者是系統資源分配和調度的單位
後者是CPU調度和分配的單位,一個進程可以有很多個線程,這些進程共享這些資源。