CLR基础

来源:互联网 发布:网络云端 编辑:程序博客网 时间:2024/05/17 21:53

CLR(Common Language Runtime)可以说是.NET的核心,它管理着垃圾收集,代码安全验证等重要内容。 要想查看自己电脑上装了哪些版本的CLR,MS 的.NET SDK2.0 中有一个工具叫:CLRVer.exe 运行这个工具在加上-all开关,即可查看。

我们知道c#的编译器有两种模式:Debug和Release,这两种模式对IL代码和最终的本地代码的优化是不一样的。例如在Debug模式下,我们用ILDasm查看IL代码会看见里面有好多的NOP指令,就是控操作的意思,为了方便调试用。但是Release下却没有这些指令。

Compiler Switch Settings                            C# IL Code Quality                JIT Native Code Quality
/optimize- /debug- (this is the default)       Unoptimized                          Optimized
/optimize- /debug(+/full/pdbonly)                Unoptimized                          Unoptimized
/optimize+ /debug (-/+/full /pdbonly)          Optimized                               Optimized

以上就是不同的设置对代码产生的不同影响。

我们知道c#去掉了指针的功能,不能直接操作内存,其实这样说不太准确。只能说是C#不推荐大家使用指针。但是并没有真正的消除指针。大家可以在方法前加上unsafe关键字,并且在项目的属性里面选择允许不安全代码运行,就可以正常使用指针。但是带来的一些不安全因素由自己负责。

.NET的类库非常庞大,下面介绍几个最基础的:

System                                                    包含每个应用程序都要使用的全部基本类型
System.Data                                            包含用于数据库通讯和数据处理的类型
System.Drawing                                       包含处理2D图形的类型
System.IO                                                包含用于执行流IO操作和浏览目录文件的类型
System.Net                                              包含一些网路通讯和Internet通讯的类型
System.Runtime.InteropServices              包含与非托管平台互操作的类型
System.Security                                        包含保护数据和资源的类型
System.Text                                               包含处理采用各种编码方式的文件的类型
System.Threading                                     包含异步操作和同步资源访问的类型
System.Xml                                               包含用于处理XML框架的类型

下面我们用张图说明一下CTS,CLS,CLR以及C#,VB.NET等之间的关系

我们可以看到CTS是最大的集合,它描述了类型的定义及行为方式。而CLS它详细定义了一个最小特征子集。CLR/CTS支持的特性要比CLS多了很多。而C#,VB.NET等是微软在CTS下的一个实现。你自己也可定义语言,只要它实现了CLS并且符合CTS就可以在.NET运行。当然编译器自己写了....如果要想使用CTS的所有特性,只有只使用IL代码写程序才可以。然后使用ILAsm工具,把IL代码编译成可执行文件运行。不过这可不是一般人能够做到的。要想检查程序集是否与CLS兼容,可以在命名空间前加上[assembly:CLSCompliant(true)]这个特性,编译器在编译的时候就会检查兼容性。

下面看个例子:

using System;

[assembly: CLSCompliant(
true)]
namespace SomeLibrary {

public sealed class SomeLibraryType {

public UInt32 Abc() return 0; }

public void abc() { }

private UInt32 ABC() return 0; }
}

}
 
原创粉丝点击