![](https://img-blog.csdnimg.cn/20191217163329595.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C#
文章平均质量分 81
C#是最好的编程语言
金朝
活到老,学到老.
展开
-
托管代码与非托管代码之间的交互
否则,调用者就看不见被调用者修改的内容。2.1、System命名空间下的Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Single、Double类型为blittable基元类型。8.4、当String以LPStr、AnsiBStr、BStr、TBStr、LPUTF8Str非托管类型按照引用传递时,互操作封送器在非托管代码调用返回时会将辅助缓冲区中的内容复制回托管代码中的一个新String中。原创 2022-12-24 18:04:11 · 1118 阅读 · 1 评论 -
不安全代码
2、从任何整数类型(sbyte、byte、short、ushort、int、uint、long、ulong)转换成任何指针类型。2.3、固定大小缓冲区的元素类型应该为预定义类型(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool)。3.1.1、当指针指向非托管类型T的静态字段变量时,如果类型T*可以隐式转换为该指针类型,那么初始化程序就会计算指定静态字段变量的固定地址。原创 2022-12-24 17:06:20 · 560 阅读 · 0 评论 -
Expert .NET IL Assembler:ILAsm语法
词法标记:如下所示:1.ID:C风格的字符和数字混合的标识符(例如,Hello_There2)。2.DOTTEDNAME:复合的以句点分割的名称(例如,System.Object)。3.QSTRING:C风格的双引号字符串(例如,“hi\n”)。4.SQSTRING:C风格的单引号字符串(例如,‘hi’)。5.INT32:C风格的32位整数(例如,235,03423,0x34FFF)。6.INT64:C风格的64位整数(例如,-2353453636235234,0x34FFFFFFFFFF)。原创 2020-08-05 18:14:39 · 360 阅读 · 0 评论 -
CLR via C#:混合线程同步构造
基础知识:如下所示:1.混合线程同步构造合并了用户模式构造和内核模式构造。2.同步块中包含内核对象,拥有线程标识,递归计数以及等待线程计数。3.CLR初始化时在堆中分配一个同步块数组,堆对象的同步块索引初始值为-1。ManualResetEventSlim / SemaphoreSlim类:如果线程没有竞争资源,就使用用户模式构造。如果线程有竞争资源,当线程自旋期间获取到资源就使用用户模式构造;否则就使用内核模式构造。Monitor类:具有以下特性:1.Enter函数:CLR设置对象的同步块索引原创 2020-08-03 18:20:20 · 215 阅读 · 0 评论 -
CLR via C#:基元线程同步构造
基础知识:如下所示:1.线程安全指的是多个线程试图同时访问数据时,数据不会被破坏。2.FCL保证所有的静态函数都是线程安全的,但是不保证所有的实例函数都是线程安全的。3.建议自定义类库的所有静态函数以及协调线程的实例函数都是线程安全的,其他实例函数都是非线程安全的。4.将线程从用户模式和内核模式之间相互切换时会造成巨大的性能损失。用户模式构造:具有以下特性:1.用户模式构造使用特殊CPU指令来协调线程。2.在用户模式构造上阻塞的线程池线程永远不认为已阻塞,所以线程池不会创建新线程来替换这种临时原创 2020-07-30 16:28:02 · 270 阅读 · 0 评论 -
CLR via C#:IO限制的异步操作
执行同步IO操作:流程如下图所示:执行异步IO操作:流程如下图所示:原创 2020-07-22 19:16:44 · 238 阅读 · 0 评论 -
CLR via C#:计算限制的异步操作
执行上下文:具有以下特性:1.执行上下文内部包括安全设置,宿主设置以及逻辑调用上下文数据。2.CLR自动造成初始线程的执行上下文流向任何辅助线程。但是可以使用ExecutionContext类来阻止执行上下文的流动以提升应用程序的性能。协作式取消和超时:具有以下特性:1.CancellationToken类的使用规范如下所示:1>.None属性:获取一个不和任何的CancellationTokenSource对象关联的CancellationToken对象。2>.CanBeCance原创 2020-07-14 16:15:01 · 233 阅读 · 0 评论 -
CLR via C#:线程基础
基础知识:如下所示:1.不同的应用程序会分配成不同的进程(一个虚拟地址空间)。一个进程中使用的代码和数据无法被另一个进程访问,从而确保应用程序的健壮性(可靠性)。2.一个进程中可以分配多个线程,且不同进程的线程之间互相独立。当一个进程中的线程被冻结时,其他进程的线程可以正常执行,从而确保应用程序的响应能力。3.线程的数量不超过CPU数目时,线程可以全速运行;否则就会出现上下文切换和性能损失。线程内存开销:如下所示:1.线程内核对象:OS创建线程时都会分配并初始化的内存块。具有以下部分:1>原创 2020-07-03 15:44:55 · 207 阅读 · 0 评论 -
CLR via C#:与WinRT组件互操作
基础知识:如下所示:1.WinRT组件使用由ECMA协会标准化的.NET元数据格式(ECMA-335)来描述其API。原创 2020-07-02 17:51:58 · 498 阅读 · 0 评论 -
CLR via C#:运行时序列化
对象图:它是一个抽象的概念,代表的是对象系统在特定时间点的一个视图。(反)序列化:序列化是将对象图转换成字节流的过程;反序列化是将字节流转换回对象图的过程。具有以下特性:1.XmlSerializer和DataContractSerializer类可以将XML进行序列化和反序列化。2.BinaryFormatter格式器可以将对象图进行序列化和反序列化。3.可以将多个对象图序列化到一个流中;然后从该流中反序列化成多个对象图。4.序列化对象图时,类型的全名和类型定义程序集的全名会被写入流;然后反序列原创 2020-06-30 19:48:37 · 251 阅读 · 0 评论 -
CLR via C#:程序集加载和反射
程序集加载:具有以下特性:1.Assembly.Load:在大多数动态可扩展应用程序中,该函数是将程序集加载到AppDomain的首选方式。2.AssemblyName.GetAssemblyName:该函数打开指定的文件,找到AssemblyRef元数据表的记录项,提取程序集标识信息,然后以AssemblyName对象的形式返回这些信息。3.Assembly.LoadFrom:该函数用来加载指定路径名的程序集。流程如下所示:1>.调用AssemblyName.GetAssemblyName函原创 2020-06-24 20:27:06 · 413 阅读 · 0 评论 -
CLR via C#:CLR寄宿和AppDomain
CLR寄宿:流程如下所示:1.调用MSCorEE.dll中的CLRCreateInstance函数来获取一个ICLRMetaHost接口。2.调用ICLRMetaHost接口的GetRuntime函数来指定宿主要创建的CLR版本,并获取指向非托管ICLRRuntimeInfo接口的指针。3.调用ICLRRuntimeInfo接口的GetInterface函数来获取ICLRRuntimeHost接口。4.调用ICLRRuntimeHost接口的相关函数来完成以下事情:1>.设置宿主管理器,告诉原创 2020-06-22 13:00:41 · 274 阅读 · 0 评论 -
CLR via C#:托管堆和垃圾回收
访问资源:流程如下所示:1.调用IL的newobj指令,为代表资源的类型分配内存。2.初始化内存,设置资源初始化状态并使资源可用。3.访问类型的成员来使用资源。4.由垃圾回收器自动释放内存。托管堆基础:如下所示:1.托管堆指的是进程初始化时,CLR开辟的一个地址空间区域。2.托管堆内部维护一个NextObjPtr指针来指向下一个对象在托管堆中的分配位置。3.当一个区域被非垃圾对象填满后,CLR会开辟更多的区域。这个过程一直重复,直至整个进程地址空间被填满。所以应用程序的内存受进程的虚拟地址空原创 2020-06-16 16:53:51 · 363 阅读 · 0 评论 -
CLR via C#:异常和状态管理
异常处理机制:如下所示:1.异常结构:由一个try块+零个catch块+一个finally块组成;或者由一个try块+至少一个catch块+可选的一个finally块组成。参考伪代码如下所示:try{ // 需要得体地进行异常恢复和/或资源清理的代码放在这里}catch(InvalidOperationException){ // 从InvalidOperationException恢复的代码放这里}catch(IOException){ // 从IOException恢复的代码放这原创 2020-06-09 21:25:53 · 381 阅读 · 0 评论 -
CLR via C#:可空值类型
可空值类型:C#中值类型不能为null,但是C#中引入了一个Nullable类型来兼容非托管模块中传入的null。具有以下特性:1.Nullable类型中存在hasValue(bool)和value(T)两个字段。当hasValue为false时,value取值为default(T);当hasValue为true时,value取值为传入参数值。2.由于Nullable类型本身是值类型(T被约束成struct),所以它的实例仍然可以在栈上,而且实例的大小和T代表的原始值类型基本一样,只是多了一个hasVa原创 2020-05-28 14:55:21 · 197 阅读 · 0 评论 -
CLR via C#:定制特性
定制特性:具有以下特性:1.定制特性可以应用于程序集,模块,类型(引用类型,结构,枚举,接口,委托),字段,函数(包含构造函数),函数参数,函数返回值,属性,事件以及泛型类型参数。2.定制特性实际上是一个派生自Attribute类型的实例。将定制特性应用到目标元素身上时,必须提供定位参数(也就是定制特性的构造函数所需要的参数)以及可选的命名参数(也就是定制特性的公共字段或者属性)。同时编译器会在元数据表中生成特性信息,该元数据特性信息可以在运行时查询,从而动态改变代码的执行方式。3.C#中使用[]来表原创 2020-05-28 14:54:30 · 233 阅读 · 0 评论 -
CLR via C#:委托
使用委托:使用流程如下:1.使用delegate关键字来定义委托类型,此时编译器会生成完整的委托类型。参考代码如下所示:// 使用delegate关键字来定义委托类型public delegate float MyDelegate(double pd, int pi, string ps, object po);// 编译器生成完整的委托类型public class MyDelegate : System.MulticastDelegate{ // 构造函数 public MyDelegat原创 2020-05-28 14:53:36 · 217 阅读 · 0 评论 -
CLR via C#:数组
数组:是一种允许将多个数据项作为集合来处理的机制。具有以下特性:1.数组隐式派生自Array抽象类以及隐式实现IEnumerable,ICollection和IList接口。所以数组是在托管堆上分配的引用类型。2.数组初始化器的格式为"{数据项1, 数据项2, …}"。用来在数组定义时执行初始化工作。参考以下代码:string[] names = new string[2];names[0...原创 2020-05-28 14:52:48 · 302 阅读 · 0 评论 -
CLR via C#:枚举类型和位标志
枚举类型:具有以下特性:1.C#中枚举类型继承自基础类型(byte,sbyte,short,ushort,int(默认),uint,long,ulong) ,但是IL中枚举类型继承自System.Enum,并且内部定义了一组常量字段和一个实例字段。其中常量字段的类型为枚举类型,常量字段名称为符号名称,常量字段值为16进制基础类型值;实例字段类型为基础类型,实例字段名称为value__。参考代码如...原创 2020-05-28 14:52:05 · 248 阅读 · 0 评论 -
CLR via C#:字符,字符串和文本处理
字符:类型为Char,代表16位的Unicode代码值。具有以下特性:1.通过Char类中的GetUnicodeCategory函数,可以获取指定字符的UnicodeCategory枚举类型。而该枚举类型中定义了控制字符,货币符号,小写字母,大写字母,标点符号,数学符号以及其他字符。2.Char类中的ToLowerInvariant以及ToUpperInvariant函数,以忽略语言文化的方式...原创 2020-05-28 14:51:07 · 236 阅读 · 0 评论 -
CLR via C#:接口
接口:接口实际上是对一组函数签名进行统一命名。具有以下特性:1.C#中用interface关键字来定义接口,并且约定接口名字以I开头。2.CLR不允许类继承多个类;但是允许类继承单个类和多个接口。3.CLR不允许接口继承类;但是允许接口继承多个接口。4.CLR允许接口中定义静态成员,但是CLS(包含C#等编程语言)不允许定义静态成员。5.接口中的函数可以是普通函数,事件以及属性。6.接...原创 2020-04-22 16:48:31 · 212 阅读 · 0 评论 -
CLR via C#:泛型
泛型:是CLR和编程语言提供的一种特殊机制,它支持另外一种形式的代码复用(即算法复用)。具有以下特性:1.泛型的优点具有源代码保护(不用公开泛型源代码),类型安全(必须指定类型实参),更清晰的代码和更佳的性能(避免类型转换以及装箱拆箱等过程)。2.CLR允许创建泛型引用类型,泛型结构体值类型,泛型接口,泛型委托和泛型函数。3.C#约定泛型类型参数名至少是以T开头,如T,TKey,TValue,TEventArgs等。4.具有泛型类型参数的类型叫做开放类型。该类型是不能创建对象的,并且可以在原创 2020-04-22 11:24:00 · 200 阅读 · 0 评论 -
CLR via C#:事件
设计要公开的事件类型:流程如下所示:1.定义EventArgs派生类来存储附加数据。通常将字段设置成只读的,然后提供属性来获取字段。参考代码如下所示:public class MyEventArgs:EventArgs{ private readonly int m_Age; private readonly string m_Name; public MyEventArgs(in...原创 2020-04-22 11:18:00 · 272 阅读 · 0 评论 -
CLR via C#:属性
无参属性:属性可以看成是智能字段。具有以下特性:1.属性中操作的字段称为支持字段。通常将支持字段设置成私有的,可以防止外界访问修改,从而造成未知异常。2.属性可以使用任何可访问性。3.属性可以应用于静态属性,实例属性,抽象属性,虚属性。4.属性提供get函数用来获取字段值,提供set函数用来修改字段值。程序员可以根据自己的需求选择性的实现get,set函数,也可以在函数内部做安全性验证等操...原创 2020-04-22 11:17:29 · 291 阅读 · 0 评论 -
CLR via C#:参数
命名参数:在调用函数时可以为指定参数名设置参数值。如fun(string str)函数在调用时可以使用fun(str:“参数值”)的形式进行调用。具有以下特性:1.在重命名参数名时也要将对应命名参数重命名一下。2.命名参数必须出现在实参列表的最后。3.使用ref或者out修饰参数时,命名参数必须以变量的形式进行传递参数。如:Int32 num = 5M(x:ref num)可选参数:...原创 2020-04-22 11:17:16 · 210 阅读 · 0 评论 -
CLR via C#:常量,字段和方法
常量:具有以下特性:1.C#允许定义基元类型常量,也允许定义非基元类型常量(值必须为null)。2.常量被视为静态成员(不能用static修饰),而不是实例成员。字段:具有以下特性:1.C#允许定义任何数据类型的字段。常用的字段修饰符如下表所示:CLR术语C#术语说明Staticstatic字段是类型的一部分,而不是实例的一部分。当类型首次加载到AppDomai...原创 2020-04-22 11:17:00 · 192 阅读 · 0 评论 -
CLR via C#:成员基础
类型中的各种成员:在一个类型中可以定义0个或者多个以下种类的成员:1.常量:只能被类型访问且不可以对常量值进行修改。2.字段:静态字段只能被类型访问;实例字段只能被实例访问;不可以对只读的字段值进行修改;建议将字段设置成私有以防止被外部代码破坏状态。3.类型构造器:格式为"static 类型名() {}",用来对类型的静态字段进行初始化。4.实例构造器:格式为"public 类型名(参数列...原创 2020-04-22 11:16:37 · 150 阅读 · 0 评论 -
CLR via C#:类型基础(基元类型,引用类型和值类型)
基础知识:如下所示:1.所有的类型都是显示或者隐式的继承自System.Object;所有的对象都是通过new操作符来创建,通过垃圾回收机制(没有delete操作符)自动回收。2.CLR在查找类型时会先从当前文件中进行查找,找不到时就会从引用的程序集中进行查找,如果还是找不到就会从命令空间中进行查找。如果查找的类型具有二义性的话,可以使用以下方案解决:1>.在类型前面加上明确的命名空间...原创 2020-04-22 11:16:04 · 373 阅读 · 0 评论 -
CLR via C#:共享程序集和强命名程序集
基础知识:如下所示:1.程序集可以采取私有或全局两种部署方式。其中私有部署指的是部署到应用程序根目录或者子目录,而全局部署指的是部署到一些公认位置。2.CLR支持弱命名和强命名两种程序集。区别如下所示:1>.两种程序集的结构完全相同,唯一区别就是强命名程序集使用发布者的秘钥进行签名。2>.弱命名程序集只能使用私有部署方式,而强命名程序集可以使用私有和全局两种部署方式。3>...原创 2020-02-21 18:27:40 · 477 阅读 · 0 评论 -
CLR via C#:生成,打包,部署和管理应用程序和类型
将类型生成到模块中:.net framework在安装时,会在%SystemRoot%\MicroSoft.NET\Framework(64)\vX.X.X目录下生成csc.exe和csc.rsp(编译参数配置响应文件)文件。具有以下特性:1.csc.exe是编译器执行文件,负责将c#源文件编译成指定类型目标文件。常见的编译参数如下表所示:参数描述/out输出目标名,如:...原创 2020-01-06 11:27:34 · 307 阅读 · 0 评论 -
CLR via C#:CLR执行模型
CLR简介:CLR也叫做公共语言运行时,只要编程语言(C#,Lua,IL等)是面向CLR规范的,那么这些编程语言也就具有CLR中定义的能力(内存管理,程序及加载,安全性,异常处理和线程同步等)。执行模型:以C#编程语言为例,执行过程如下所示:1.使用C#编写源代码文件。2.使用C#编译器将C#源代码文件编译成托管模块。1>>.编译器主要做语法检查以及分析源代码工作。2>...原创 2019-12-30 15:21:09 · 316 阅读 · 1 评论