zoukankan      html  css  js  c++  java
  • C#

    C#基础(Learning C#)

    .NET Framework(FCL)

    C#程序需要运行的环境是.NET Framework,这是一个.NET的核心框架,它是一组程序集的集合,包含数以千计的类型,这些类型提供了各种功能方便程序员使用。除了Framework,微软还发布了windows azure sdk和directx sdk,这些类库框架可以使你开发基于internet通信协议的Asp.Net MVC、Web Service、Windows Communication Foundation程序,或Windows Service、Windows GUI、Windows Store(windows桌面应用)或仅仅是开发一个组件库(类库集成)。打开windows的设置-程序和功能-启用或关闭windows功能,可以查看.NET Framework的版本。

    类库(Libray)

    类库是各种类型的集合,经由C#编译器编译后变成dll文件。为项目添加引用所要使用的类库后,然后在cs文件中using类库包含的类的命名空间,这样就可以调用类库提供的API了,如果你忘记或不知道API所在的命名空间,那么只要你保证添加了该API所在类库的引用,然后敲出API的名称,光标移入名称,Alt+F10,vs会自动提示其所在的命名空间。下图添加了对单元测试框架的乐酷引用,使用了一个特性类,但不知道该类时在哪个命名空间下的,Alt+F10即可。

    组件(Component)

    即便是一个单类文件,也可以将其看做是一个组件,类即组件。

    控件(Control)

    UI界面上用于提供给用户操作输入的可视化零件,每个控件都有一个C#类型,也即控件也是一个类。

    解决方案(Solution)

    解决方案就是为企业的需求提供一整套由多个项目组成的实现。比如为企业的不同需求提供了平板、手机、客户端浏览器、数据存储等服务项目,每一个都是单独的项目,它们共同在一个解决方案之下。 

    项目(Project)

    一个Solution下面可以有多个Project。每个项目分工明细,各有各的专长和目的。一个项目可以编译成一个程序集,多个项目也可以编译成一个程序集,还可以将一个项目分开编译成多个程序集。

    程序集(Aseembly)

    程序集也称为组件,它被Clr托管,所以也称其为托管代码,.exe或.dll文件都是程序集,dll称为动态链接库(Dynamic Link Library),是一个封装二进制数据的库文件。这种文件不能直接运行,但它公开库函数供其他可直接运行的程序调用。exe与dll一样也是一个封装二进制数据的库文件,提供了一个Entrypoint的入口函数(Main)区别就在于exe文件因为包含了一个入口函数Main,所以exe文件可以直接双击执行,而dll是不可直接执行的文件,但它也包含了一组供给外部的可执行程序调用的类型。不管是exe还是dll,它们都是Clr托管的程序集。NET Freamework就是一个类型的框架集合,存储了数以千计的类型,而Library虽然也是类型的存储库,两者都是方便程序员调用类、调用函数的集,但框架比类库具备更多的类型,提供了更强大的开发支持,而类库通常比较小,但两者的物理存储都是扩展名为dll的文件,统称为程序集(Aseembly)。Clr托管的代码默认可以运行在32位或64位的windows操作系统上,但如果有特殊需求,比如源代码存在不安全代码、源代码需要和非托管代码进行互操作或希望程序运行在指定的windows版本上,那么可以通过右击项目-属性-生成-更改平台目标将指定C#编译器将源代码编译为指定的托管模块。

    Console.WriteLine(Environment.Is64BitOperatingSystem);//确定当前操作系统版本是否是64位
    Console.WriteLine(Environment.Is64BitProcess); //确定当前进程是否是64位进程

    生成程序集

    CSC.exe编译器集成在Visual Studio中,直接右击项目即可将源代码生成为可托管的应用程序。但你也可以手动使用命令行工具调用CSC.exe编译器将你的源代码文件编译成可移植的托管文件(PE,Protable Executable),而exe和dll都属于可托管的PE文件,可移植是指这种文件可以在32位,64位系统上运行。手动使用CSC.exe工具需要配置环境变量,具体操作如下:

    在c盘根目录搜索Microsoft.NET,进入此目录后找到Framework,打开最新的版本目录,复制目录路径(如:C:WindowsMicrosoft.NETFrameworkv4.0.30319)

    右击电脑-属性-高级系统设置-环境变量-双击系统变量的Path-点击编辑文本,将Framework的目录路径字符串粘贴追加到Path的值后面: 

    ; C:WindowsMicrosoft.NETFrameworkv4.0.30319//如果Path已经有值,则此路径前必须加上;号,否则不加,最后以;号结尾

    按住Shift键同时右击需要编译的cs文件所在的目录-在此处打开Powershell,输入的编译命令可参考以下选项:

    //格式
    csc/t:生成的文件格式 cs文件名
    //例子
    csc/t:exe/r:Animal.dll; Person.dll TestApp.cs TestApp2.cs
    //参数
    csc:使用csc编译器
    /t(target):目标类型,exe(CUI控制台程序)| winexe(GUI窗体图形程序)| appcontainerexe(windows store程序)| library(库,dll文件)| winmdobj(winMD库)
    /r(reference):可选 引用的程序集,xxx.dll每个程序集以; 号隔开,最后一个不加;号 如:csc/t:exe/r:x.dll;y.dll x.cs y.cs
    cs文件名:需要编译的cs文件,可使用通配符:*.cs,此项前面不加/号,可以在任何其他参数开关后面输入空格后指定此项的文件名,每个文件以空格隔开
    /out:可选 编译后输出的文件名,如:x.exe,如果需要指定生成的文件的名称就可以使用此选项,如果不指定就用默认的方式将该cs文件的名称作为输出文件的名称
    /win32res:可选 指定一个.res的文件路径,编译时将把该文件嵌入到PE文件中,如果使用Visual Studio,则右击项目-属性-应用程序-添加资源文件即可
    /win32icon:可选 指定一个.ico的文件路径,编译时将把该文件嵌入到PE文件中,如果使用Visual Studio,则右击项目-属性-应用程序-添加资源文件即可
    /?, /help 在控制台的计算机屏幕上显示编译器的选项
    /addmodule 添加已经编译好的netmodule模块到程序集
    /baseaddress 指定装入DLL的基础地址
    /bugreport 创建一个文件,该文件包含是报告错误更加容易的信息 
    /checked 如果整数计算溢出数据类型的边界,则在运行时产生一个例外的事件 
    /codepage 指定代码页以便在编译中使用的所有源代码文件
    /debug* 发送调试信息
    /define 定义预处理的程序符号
    /doc* 把处理的文档注释为XML文件
    /fullpaths 指定编译输出文件的反正路径
    /incremental 对源代码的文件进行增量编译
    /linkresource 把.NET资源链接到集合中
    /main 指定Main方法的位置 
    /nologo 禁止使用编译器的标志信息 
    /nooutput 编译文件但不输出文件 
    /nostdlib 不导出标准库(即mscorlib.dll) 
    /nowarn 编译但编译器并不显示警告功能 
    /optimize 打开或者关闭优化 
    /recurse 搜索编译源文件的子目录 
    /unsafe 编译使用非安全关键字的代码 
    /warn 设置警告级别
    /warnaserror 提升警告为错误

    程序集包含的各种文件

    程序集是多个文件的集合,它包含清单(manifest文件)、类型的元数据文件(PE文件)、模块文件(netmodule)、资源文件(任何格式的文件,如txt、excel、jpg)。程序集合并了这些文件,以二进制数据进行存储。有时候,也把dll和exe称为PE文件,但它们同时也是程序集文件。

    1.PE文件(Portable Executable)

    PE文件是一个抽象的概念,被称为可移植执行体,项exe、dll都是属于PE文件的范畴。exe、dll包含以下信息: 

    1.PE32(+)头 :描述了应用程序使用的是哪个版本的操作系统(32位、64位或ARM)、程序的类型(CUI[控制台类型]、GUI[窗体图形类型],组件式[类库])

    2.Clr头 :描述了Clr版本主、次版本号、MethodDef token(指定了CUI,GUI,Windows Store模块的入口方法)、强名称数字签名、元数据表的大小 

    3.IL代码:中间语言 

    4.元数据 :由三种描述元数据的表构成的二进制数据块,CSC编译器执行编译源代码的时候会将类型的信息填充到这几种表里面。

    第一种:Difinition表

    第二种:Reference表 

     

    第三种 Manifest表 

    附:ExportedTypesDef表的记录除了那些公开导出的类型(public修饰符的类型),它还包括了不包含在程序集中的单模块文件的信息(如果有这样的模块),参看本页的模块文件。

    附:查看程序集的元数据可以使用IDASM.exe工具来反汇编exe或dll程序集,然后选择视图–元数据即可。 

    2.清单文件(Manifest)

    这份清单用于描述程序集的各个模块,描述了程序集版本号、安全信息、语言文化、发布者、组成程序集的所有模块的名称、PE文件中的元数据表。这个文件是Clr加载程序集时的入口。 

    3.模块文件(NetModule)

    被编译后的cs文件称为模块文件(后缀名是netmodule或没有清单的单模块的dll文件),单模块文件不包含清单,而Clr加载程序集必定要使用清单文件,否则Clr无法读取类型元数据,并且Visual Studio不会单独生成这种文件,Visual Studio将这种文件的数据封装到了程序集中。但你可以利用CSC.exe将cs文件编译成一个一个的单模块,然后再利用AL.exe把每个单模块文件编译进一个程序集。合并多个模块的命令行语句如下:

    //先利用CSC.exe生成模块文件
    csc/t:module /out:moduleName1.netmodule x.cs
    csc/t:module /out:moduleName2.netmodule y.cs
    //接着利用AL.exe(程序集链接器)将单模块合并为一个程序集
    al/out:自定义程序集名称.dll /t:library 模块1.netmodule 模块2.netmodule 

    编译单模块的好处在于,把不是必须的源代码单独编译成一个模块,再把其它主要的模块编译成程序集供用户使用,而不必须的模块因为被单独部署成分离的单文件,所以可以将它放在网上提供下载,供有特殊需求的用户使用,如果需要将分离的模块追加到程序集,可通过命令行语句addmodule指示CSC.exe编译器生成清单时要把分离的模块的元数据添加到程序集的清单元数据表的FileDef、ExportedTypesDef表中。一旦分离模块的信息被写入程序集,那么该模块文件就必须提供,否则Clr加载程序集时会找不到这个模块文件(含有IL代码)导致异常。也即注册在程序集清单上的所有文件都必须存在,否则Clr不能正常执行。另外,合并单模块还有一个好处,只要模块所使用的语言是面向CTS、CLS规范的语言,那么可以将以不同语言实现的模块合并为一个程序集,程序员在使用这个程序集时不用关心该类型是用什么语言定义的,只需要使用它们即可。

    //生成单模块
    csc/t:module /out:x.netmodule x.cs
    //生成程序集,同时将单模块信息添加到程序集清单
    csc/out:my.dll/t:library/addmodule:x.netmodule y.cs h.cs

    4.资源文

    程序要使用的数据文件,如jpg、excel等等……

    利用Visual Studio 集成开发环境(IDE,Integrated Development Environment)为项目添加引用

    你的源代码可以引用其他程序集以便使用程序集提供的类型,展开项目-引用-添加引用,可以选择.NET Framework提供的程序集,也可以通过点击浏览按钮引用其他的程序集。引用分为黑盒引用和白盒引用。黑盒即引用没有源代码的dll,白盒即引用有源代码的类库,后者只需要使用using源代码类库的命名空间即可使用该库的类型,而前者必须先添加对dll的引用,再using要使用的类型的命名空间。

    程序集版本信息

    可以使用AL.exe或Visual Studio为程序集定义相关的信息,在VS中展开项目-properties-打开AssemblyInfo.cs文件,该文件利用assemblyAttribute特性定制了程序集的信息,这些信息包括程序集名称、说明、公司、对COM 组件的可见性以及程序集的版本号。你可以手动修改这些特性的值,也可以通过右击项目-属性-引用程序-程序集信息来打开可编辑的程序集信息对话框来完成对程序集信息的修改。

    当C#编译器编译生成程序集时会将这些定制的信息合并到程序集中。其中程序集的版本信息由4个部分组成:

    major(主版本号) minor(次版本号) build(内部版本号) revision(修订号)
            2                               5                       719                             2
    主版本和次版本号:面向用户,使他们容易理解
    内部版本号:公司每生成一次程序集则build++
    修订号:修复bug后每生成一次程序集则revision++,所以每生成一次build和reversion都++

    在源代码中获取程序集版本信息

    FileVersionInfo dllFileInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(@"C:UsersConsoleApp1.exe");
    Console.Write(dllFileInfo.FileVersion);

    C#编译器(csc.exe)

    Visual Studio自带面向Clr的C#编译器,当右击项目-生成的时候就是在使用编译器编译项目的源代码,因为源代码是不能被CPU执行的代码,它需要被编译器编译为IL代码和元数据,编译器会自动将IL、元数据、资源文件(html、jpg……)合并成一个或多个模块,然后将模块转换为程序集(所以程序集也可以称为模块的集合)再交由Clr托管。

    IL中间语言(Microsoft Intermediate Language)

    IL与CPU也没有任何关系,它是微软研发的一套比CPU指令更高级的面向对象的机器语言,IL包含了很多的指令,这些指令可以访问类型、调用方法、操作集合、抛出异常。IL语言可以通过微软提供的ILAsm.exe汇编器来编写,也可以通过微软提供的ILDasm.exe对IL进行反汇编。

    Clr(Common Language RunTime 公共语言运行时)

    随.NET Framework一起发布的有Clr,Clr是托管C#程序集的管理单元,Clr可以进行内存管理、加载程序集、保障程序的安全性、异常处理和线程同步。所有面向Clr的程序语言都能享受Clr带来的便利。Visual Studio自带的编译器就是面向Clr的,它将源代码编译成IL代码和类型的元数据,这些IL和元数据被合并成模块,再由编译器转换为程序集。C#只向程序员公开了Clr的一小部分功能,但IL汇编语言允许程序员使用Clr的全部功能。也即,如果C#隐藏的那些Clr高级功能无法满足你的需求,你可以换用IL汇编语言去写那部分C#不公开的Clr代码。Clr作为一个引擎,在同一台计算机上是可以存在多个版本的,不同版本之间可以通过配置良好共存。

    JIT即时编译器(Just In Time)

    CPU不认识IL语言,它还需要被Clr提供的JIT编译为CPU指令才能在内存中执行。托管应用程序启动时,Windows操作系统的OS Loader(可移植执行体装载器)将装载两个PE文件,第一个就是执行的程序集,第二个是创建Clr的MSCoreEE.dll。OS Loader首先将PE文件(比如exe、dll)载入,检查PE文件头部信息,明确应该为程序创建32位进程或64位进程 - 确定程序运行的位数后,在进程所处的内存中加载对应版本(32、64、ARM)的MSCoreEE.dll - 主进程会自动调用MSCoreEE.dll的_CorExeMain函数,该函数调用一个Clr Host来初始化Clr - 常见的Clr Host有asp.net(aspnet_isapi.dll、IE、Shell、数据库引擎等等)Clr搭建完成后将由Clr加载将要执行的程序集 - 它从程序集清单文件中扫描所有即将用到的类型的元数据,然后在应用程序的内存中为每个类型分配一小块内存来建立对应于类型的数据结构(Type表),这个数据结构是按层次关系将类型的方法放在类型之下,每个方法都有方法地址,这个方法地址对应着程序集里方法的IL代码。Clr会测试程序集元数据中某个类型在IL代码中是否有定义,类型的方法是否有定义,如果没有定义则会在编译期抛出异常。数据结构分配完成后,Clr就会初始化这个结构,初始化时会将方法的地址放进Clr内部的JITCompiler函数。在Main函数的首个方法调用的表达式出现之前,JITCompiler会执行,JITCompiler根据方法地址从其对应的程序集中找到方法的IL的代码,通过Clr的验证程序检验IL的合法性和安全性,比如检验被调用的方法的参数个数,参数类型,返回类型是否正确。如果没有问题,Clr会划分一块内存,将方法的IL代码即时编译成CPU指令(JITCompiler会根据程序集文件头的自描述将IL编译成对应的32位CPU指令或64位CPU指令或ARM指令)。接着再把这些CPU指令放进内存,然后修改Type表中方法的地址,使原来指向程序集IL代码的地址指向存储CPU指令的内存地址。最后就是执行CPU指令,首个方法执行完成,就继续执行下一个方法直到结束。假如那个方法在后来再次被调用,那么只要内存中还存有这个经过检验的方法的实现,那么不用再经过JITCompiler的编译,它会立即执行。所以,只有首次执行的代码会损耗程序的性能,之后则会全速运行。非托管的C,C++语言的代码是设计成直接针对CPU指令进行编译的,而托管代码会经历将源代码编译成IL,再编译成CPU指令。性能损耗是存在的,但不一定比非托管代码更损耗内存,甚至有可能比非托管代码的执行效率要高。 总结一下就是:Clr是应用程序的执行引擎,它托管了源代码的元数据和IL,它先在内存中载入托管代的元数据和IL,再检测代码的安全性,通过检测后再编译为CPU指令,然后将指令载入CPU,最后开始执行。

    CTS 通用类型系统(Common Type System CTS)

    Clr是.NET Framework的核心,而CTS和CLS则是Clr的核心。每种语言都有自己的类型系统,它们之间都不可能完全相同。任何语言编写的代码如果想要托管在Clr上运行,就必须提供一个可以将该源代码编译为元数据(metadata)和IL的编译器。比如Visual Studio为C#语言提供了CSC.exe编译器。这些编译器必须符合CTS对类型的规范,这样,任何被编译成元数据和IL的源代码就具有完全一样的类型系统,才可以实现不同语言的源代码之间的相互调用、获取、跨语言的类型派生。也即,每种编程语言都有自己的类型系统,但编译后都会转成CTS类型。不同的语言编写的程序直间可以相互操作。比如Vb的integer和C#的System.Int32都对应CTS的System.Int32类型。

    CLS(公共语言规范)

    CLS是CTS的一个子集,有些语言不区分大小写,不允许方法参数可变,不允许无符号整数,但有些语言又正好相反,为了能使两种语言能相互兼容,就必须定义一个最小兼容规范,这个规范称为CLS。 

    预编译工具(NGen.exe)

    托管代码都是即时编译并执行,但NGen.exe可以将IL编译后的CPU指令存储到一个文件中,Clr每次加载程序集之前默认都会查找这个预编译的文件,如果文件存在则直接将其加载到内存,否则才加载程序集。不过NGen.exe只是用于提升客户端应用的执行效率,但对web程序没有多大帮助,因为web程序只在首次加载程序集开始运行的时候会消耗大量内存,编译完成后,只要服务器不关闭,则程序今后的执行速率是非常高的。

    Namespace和Class

    命名空间中可以定义结构、枚举、委托、类。类定义在命名空间中是为了对类进行分门别类,避免引起混乱。引用了程序集之后还需要在项目的C#代码页中声明要引用的类所属于的命名空间。

    引用类的两种声明方式

    1.权限引用,每一次使用不属于当前命名空间中的类型时都必须在类型前面附加命名空间。

    2.using引用,在代码页顶部预先using该类的命名空间后,可以直接使用该类型,不需要每次都附加命名空间。

    命名空间嵌套

    嵌套时指在一个命名空间中定义了另一个命名空间,后者会作为前者的子命名空间存在。那么子命名空间可以直接访问父命名空间中定义的类型,但父命名空间不能直接访问子命名空间中定义的类型,除非使用完全限定名(权限引用)。 

    namespace Parent
    {
        public class ParentClass
        {
            //父命名空间调用子命名空间里的类
            Child.ChildClass Chil = new Child.ChildClass ( );
        }
        namespace Child
        {
            public class ChildClass { }
        }
    }

    子命名空间如果定义了与父命名空间相同名称的类,那么相互访问时需要直接使用权限引用加以区别。 

    namespace MySpace
    {
        public class Test { }
        namespace MyChildSpace
        {
            public class Test { MySpace.Test t = new MySpace.Test ( ); }
        }
    }

    命名空间中类名冲突

    如果一个项目引用了两个不同的命名空间且两个命名空间中都定义了相同的类,则可以为其中一个命名空间定义一个别名。 

    using Happyzoo;
    using Other = Evilzoo;

    Animal a1 = new Animal ( ); //使用的是Happyzoo命名空间下的Animal类
    Other.Animal a2 = new Other.Animal ( ); //使用的是Evilzoo命名空间下的Animal类,当然你可以直接使用Evilzoo.Animal 
    //但如果Evilzoo不是这样一个短名称而是非常长的名称,为其指定别名就比较有用了

    也可以为直接为命名空间的类指定别名

    using Happyzoo;
    using OtherAnimal = Evilzoo.Animal;

    Animal a1 = new Animal ( );
    OtherAnimal a2 = new OtherAnimal ( );

    注:你还可以将自定义的类放在系统命名空间中,比如放在System命名空间中,这样省去了引用命名空间的麻烦。这种做法当然不推荐,只是说明一下命名空间的作用而已

    查看类型或成员的隶属关系

    成员隶属于类型,它们在类型中被定义,而类型则隶属于命名空间,它们在命名空间下被定义。

    在一个cs页面中,鼠标放在某个类型上可以看到它所在的命名空间,但把鼠标放在new操作符后的类型上则不会显示类型所在命名空间。

    鼠标放在成员上,可以看到它是在哪个类型中被定义的,它的返回类型是什么

    鼠标放在成员上,当发现它所隶属的那个类型前出现一长串的命名空间时,说明没有把定义这个成员的类型所在的命名空间引入当前的cs页面

    引入命名空间后会发现当前这个成员所隶属的类型前不再显示命名空间

    控制台程序的Main函数

    每个程序都需要一个入口点,即程序执行的最开始地方。C#控制台程序入口点是一个Main方法,类似于C、C++、Java的入口点是小写的main方法。每个C#程序必须有一个Main方法,也可以有多个,当有多个时需要使用/main编译器选项指定哪一个Main方法作为入口点。一般使用visual studio的控制台程序就有一个定义的好的Main方法,我们自定的方法不跟Main重名即可避免这个问题。Main方法被设定为在创建任何类或实例前被调用,因此必须声明为static的。 

    namespace Test
    {
        class Program
        {
            static void Main( string [ ] args ) //参数表示用户在控制台输入的文本
            {
                string name = "leo";
                Console.WriteLine ( name ); //打印name的值
                string str = Console.ReadLine ( ); //等待用户再控制台输入文本
                Console.WriteLine ( str ); //打印用户输入的文本
                Console.ReadKey ( ); //等同于Ctrl+F5
            }
        }
    }

     

    C#基本元素

    识别某些代码用什么语言写出,就看代码使用了哪些最基本的元素。

    1.关键字(Keyword)

    对编译器具有特殊意义的预定义保留标识符。它们不能在程序中用作标识符,除非它们有一个 @ 作前缀。

    2.标识符(Identifer)

    变量名、对象名、方法名都是标识符。

    3.操作符(Operator)更多

    操作符就是执行简单运算或逻辑推断的符号。

    4.操作数(Operands)

    变量、值字面量。

    4.文本(Text)

    文本就是值,所有的值都是文本。

    5.注释(Annotations)

    注释就是不会执行的对代码的描述性文字。分行注释和块注释 

    //此处是行注释
    static void Main( string [ ] args/*此处是块注释*/ )  

    附录:.NET Framework

    .NET Framework是一个强大的C#框架,此处将简要介绍此框架的类库中一些常用的命名空间。 

    System(基础) 
    //包含了最基本的基类和接口 包括了Object、EventArgs、Exception、String、Math、Convert(对象、事件信息、错误信息、字符串、数学运算、强制转换、拷贝、比较、转换、销毁对象) 

    System.Configuration(配置) 
    //包含了操作配置文件的类 包括错误处理的类和接口 
    //子命名空间:System.Configuration.Assemblies:包含了用于配置程序集的结构和枚举 
    //子命名空间:System.Configuration.Install:提供了对编写定制组件安装程序的支持 比如Installer类 他是所有安装程序的基类

    System.Management(管理) 
    //包含了为windows管理工具(WMI)提供支持的类 是应用程序可以查询诸如可用磁盘空间和当前CPU利用率等信息

    System.Net(网络通信) 
    //包含了为创建网络连接提供的接口 其中的类支持http协议、cookie、socket、权限、身份验证

    System.Web(Web网络通信) 
    //包含了用于使用http协议启动服务器通信、浏览器通信 、支持客户端请求消息、服务端做出响应、cookie操作、文件转移、异常信息、缓存控制
    //子命名空间:System.Web.Caching:缓存
    //子命名空间:System.Web.Configuration:WEB配置类
    //子命名空间:System.Web.Security:WEB安全性、身份验证、授权

    System.IO(文件) 
    //包含了读写创建文件的类 如File、Directory、Stream、TextReader、TextWriter类

    System.Text(编码) 
    //包含了操作文本的类 提供了表示ASCII、Unicode、UTF-8编码的类、StringBuilder类 另外还有一个与文本操作有关的System.Text.RegularExpressions(包含了正则表达式的类) 

    System.Runtime.Serialization(序列化)
    //包含了用于将对象序列化为可在网络中传输的字节序列和将字节序列反序列化为对象的类 
    //子命名空间:System.Runtime.Serialization.Formatters:包含了用于序列化和反序列化的格式的类
    //子命名空间:System.Runtime.Serialization.Formatters.Binary:包含了以二进制格式序列化和反序列化的类
    //子命名空间:System.Runtime.Serialization.Formatters.Soap:包含了以SOAP消息格式序列化和反序列化的类

    System.Data(数据) 
    //包含了组成ADO.NET的类 还有5个与数据库访问有关 
    //子命名空间:System.Data.Common:包含了被.NET数据提供程序所共享的类
    //子命名空间:System.Data.Odbc:包含了OLE DB.NET数据提供程序类
    //子命名空间:System.Data.Sql、System.Data.SqlClient:包含了SQL Server .NET数据提供程序的类
    //子命名空间:System.Data.SqlTypes:包含了映射SQL Server的数据类型的类

    System.Collections.Generic(泛型)
    //包含了增加的强类型泛型集合模型和泛型接口 

    System.Reflection(反射)
    //包含了用于镜像构成应用程序的程序集、类型、方法和字段的类 提供动态创建运行时对象的类

    System.Threading(线程) 
    //包含了支持多线程编程的类、结构、枚举等等

    System.Timers(计时器) 
    //包含了基于服务器的计时器组件所需要的类 这些组件在一个递归间隔后引发一个事件 。 

    System.Runtime.InteropServices(互操作)
    //允许托管代码与非托管操作平台进行互操作

    System.Security(资源保护)
    //保护资源数据

    System.Drawing(图形)
    //包含绘图、图形数据处理的类

     

    参考资料

    Net平台下CLR程序载入原理分析

    托管代码(Managed Code)和非托管代码(Unmanaged Code)

    PE文件详解之IMAGE_NT_HEADER结构

    探密PE文件格式(Portable Executable File Format)

    可移植可执行文件格式PE文件格式英文说明文档

     

    C# - 学习总目录

  • 相关阅读:
    Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析
    软件的三层架构
    【Android小应用】颈椎保健操Android开源项目
    huffman编码——原理与实现
    30天自制操作系统之第13天 定时器(2)
    JSP中Session的使用
    [非官方]ArcGIS10.2 for Desktop扩展工具包——XTools Pro
    在C语言中,double、long、unsigned、int、char类型数据所占字节数
    nyoj 130 同样的雪花 【哈希】
    socketpair的使用
  • 原文地址:https://www.cnblogs.com/myrocknroll/p/3278703.html
Copyright © 2011-2022 走看看