CLR via C# - CLR模型

博客园对markdown支持不佳,错乱移步Github
IO 博文

CLR 的执行模型

模块/程序集

1.模块


托管模块组成部分


  • PE32/PE32+头 : PE即Portable Executable表示可执行文件

  • CLR头 : 包含所需的CLR版本,Main方法入口

  • 元数据 :
    元数据是一组数据表.其中的一些数据表描述了模块中定义的内容,比如类型或成员。还有一些描述了托管模块引用的内容,比如导入的类型、成员。

  • IL代码

元数据用途


  1. 用于编译,消除了C/CPP时期对头文件的依赖

  2. VS IntelliSense,VS读取程序集的元数据,提供代码提示

  3. 允许垃圾回收器追踪对象的生存期,CLR
    GC采用的是Mark-Sweep形式,在mark阶段,元数据可以提供某一对象的某一字段引用了哪个其他的对象,可以把引用的对象也mark一下,防止被GC回收

2.程序集

程序集是一个或多个模块/资源
文件的逻辑分组。程序集是重用、安全性、以及版本控制的最小单元。一般认为一个dll/exe是一个程序集,但是还可以生成多文件程序集,使用AL.exe

如何判断是否安装了.NET Framework,只需检查

如图,文件说明写出是

.NET
Runtime Execution Engine`

执行程序集中的代码 JIT

当一个方法第一次执行时,CLR内部的某个表会为该方法所在类型的所有方法创建一个记录项,对应着一个地址,在JIT编译IL => Native
code时查找IL代码,JIT编译好的Native Code存放在内存中,并更新表中的地址,也就是下一次调用该方法时,直接执行的是Native
Code,不用再次经过JIT了。这个不用是在一个程序的执行时间内,要是将程序关闭了,再打开还得重来。.NET都是半解释性性语言。

CTS : 通用类型系统CLS : 通用语言规范 由于各个语言实现的不尽一致,MS定义了一个

例如使用

[assembly:CLSCompliant(tue)]`指定此程序集是CLS兼容的

?





1

2

3

public
UInt32 Abc()

public
int Xyz()

public
int xyz()

以上会得到警告,因为有的语言没有unsigned int,而Xyz和xyz方法,是依靠大小写来区分的,像VB 就不能区分这两个方法.

在CLS中,类型的成员要么是一个


,像是C#提供的属性(Property),事件(event)/委托(delegate)/运算符重载
都是C#编译器提供的,到IL层,只有字段和方法.delegate会变成一个类,这个另说.

程序集生成/打包/部署


csc.exe csharp compiler


?





1

2

3

4

5

6

7

class
Hello

{

    public
static void Main()

    {

        System.Console.WriteLine("Hello World ...");

    }

}

csc /out:hello.exe /target:exe hello.cs * /out表示 输出文件* /target 或者 /t 表示输出类型
1. exe 表示CUI,控制台窗口 2. winexe GUI应用程序 3. library 生成dll 4. module
生成.netmodule模块,

:

添加module引用* /reference:
或 /r 表示添加引用

s

会生成hello.exe
/out:hello.exe 和 /t:exe 是默认的

CSC编译时默认引用MSCorLib.dll,可以指定

b

使程序不默认引用这个

响应文件(.rsp)


在CSC编译的时候,/r /t /out 命令可以保存在一个文件了,如MyProj.rsp

?





1

csc @MyProj.rsp hello.cs

还会在CSC.exe 相同目录中查找一个全局的

g

指定编译时忽略这个全局响应文件

使用/r:xxx.dll来引用一个dll时,查找路径为


  1. 工作目录,当前目录

  2. CSC.exe所在目录,MSCorLib.dll从这个文件获取

  3. /lib编译时指定 or LIB环境变量

将模块合并成程序集


hello.cs

?





1

2

3

4

5

6

7

8

class
Hello

{

    public
static void Main()

    {<br>

        System.Console.WriteLine("Hello World ...");

        Method.AStaticMethod();

    }

}

method.cs

?





1

2

3

4

5

6

7

public
class Method

{

    public
static void AStaticMethod()

    {

        System.Console.WriteLine("Hello from another module ...");

    }

}

执行

?





1

2

3

csc /t:module method.cs

csc /addmodule:method.netmodule hello.cs

hello

结果

生成的netmodule文件是一个不包含清单元数据表的PE文件,添加到一个程序集后,这个netmodule不能删除,删除会抛出FileNotFoundException
```未经处理的异常: System.IO.FileNotFoundException: 未能加载文件或程序集“method.n
etmodule”或它的某一个依赖项。系统找不到指定的文件。 ---> System.IO.FileNotFound Exception:
系统找不到指定的文件。 (异常来自 HRESULT:0x80070002) --- 内部异常堆栈跟踪的结尾 --- 在 Hello.Main() ```

使用AL.exe 程序连接器


```al.exe /t:library /out:example.dll a.netmodule b.netmodule ```使用
/link[resource]连接资源/resource 嵌入资源

程序集的私有部署

探测目录1. AppDir\ABC.dll 2. AppDir\ABC\ABC.dll 3. AppDir\privatePath\ABC.dll 4.
AppDir\privatepath\ABC\ABC.dll

privatePath在app.config中配置```

强命名程序集


```sn -k magicdawn.snk //创建一个snk,包含私钥公钥csc /keyfile:magicdawn.snk hello.cs
```或者```sn -p magicdawn.snk magicdawn.PublicKey //创建两个,publickey只包含公钥sn -tp
magicdawn.PublicKey //查看公钥```

CLR via C# - CLR模型,布布扣,bubuko.com

时间: 2024-12-15 10:33:00

CLR via C# - CLR模型的相关文章

CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集,所以不能使用IL DASM进行查看,但CLR以dll的形式位于.NET版本号文件夹内. □ C#源代码从编译到CLR运行的全过程 →编写C#源代码,以class,struct,enum,interface,delegate...的形式 →编译器把源代码编译成.dll或.exe,其中包含了一些重要信息

初入 CLR - 阅读《CLR via C#》笔记

最近买了一本书<CLR via C#>阅读了第一章 - CLR 的执行模型,对 .NET 一直提到的 CLR 和 .NET Framework 有了一个大致的了解.我理解主要体现在: ■ 各种术语有了一个大致的体会:CTS CLS 和 CLI .CLR 与 .NET Framework. IL(Intermediate Language) .CIL(Common Intermediate Language)和 托管代码(Managed Code). ■ 用 C# 写完一个程序被编译成应用程序后

CLR via C#--------CLR的执行模式

CLR:是一个可由多种编程语言使用的"运行时". CLR的核心功能(比如 内存管理.程序集加载.安全性.异常处理.线程同步)可由面向CLR的所有语言使用. CLR是完全围绕类型展开的. 面向CLR的语言编译器: Microsoft:C++/CLI.C#.Visual Basic.F#.Iron Python 以及IL汇编器. 其他公司.学院:Ada.PAL.Caml.COBOL.LOGO.PHP... 托管模块的组成部分:PE32/PE32+头.CLR头.元数据.IL代码. IL基于栈

clr via c# clr寄宿和AppDomain (一)

1 clr寄宿-----.net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用windows PE文件格式,而且要么是windows exe文件,要么是DLL文件 2,ICLRRuntimeHost可以做以下事情①设置宿主管理器.该诉CLR宿主想参与与涉及以下操作的决策:内存分配.线程调度/同步以及程序集加载等.宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知②获取C

CLR执行模型

1:首先先明确CLR的概念: 1:首先先明确CLR的概念:  CLR(Common Language Runtime):公共语言运行时,是一个可由多种编程语言使用的"运行时"; 在运行时,CLR根本不关心开发人员用的是哪一种语言来变写代码,它只关注语言是否是面向CLR(面向运行时)的. 2:CLR的核心功能包括: 内存管理.程序集加载.安全性.异常处理和线程同步. 3:如图: 无论是用的是哪一种编译器,结果都是一个托管模块(managed module),托管代码时一个标准的32位/6

C# CLR及程序集部署浅析

摘 要 .NET Framework 到底是什么?公共语言运行时和 .NET Framework 类库分别指的是什么东西?CLR. CLS. CTS.FCL等这些又是什么?为什么出现程序集的概念?它与动态链接库的区别是什么?什么是强命名程序集?如何签名及部署程序集?这一章将帮助您学习和了解其中的秘密. 第一节 .NET Framework是什么? .NET Framework(.NET框架),是由微软提出并实施的一个集成在Windows中的组件.它基于虚拟机技术实现的平台无关性的软件开发平台,它

CLR 这些年有啥变化吗?

引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.不说原因啦,也是为了做广告.这里提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体,和Java的JVM有着类似的功能(JAVA为跨平台而生,实现这一目标离不开JVM). 随着.NET Framework的日益发展CLR也有日新月异的变化.这些变化为开发带来更多有用的特性,在提高开发效率的同时也提高了程序的性能和稳定性.   如果大家觉得还有必要把这块更新的更好,还请多多反馈. 如果觉的

【.NET Framework 基础】——CLR、BCL、DLL、Assembly

.NET FrameWork是用于Windows的新托管代码编程模型,它包含CLR(Common Language Runtime)以及BCL(Base CLass Library)构成. 一.CLR 1.CLR是什么? Common Language Runtime,公共语言运行时,和JVM(Java Virtual Machine,Java虚拟机实现了Java的与平台无关的特性,它屏蔽了平台的具体信息,只需生成在Java虚拟机上运行的目标代码就可以在任何平台上都可以运行.一次编译,到处运行)

使用用户自定义类型 CLR UDT

? ? 一些复合类型进行范式分解是没有必要的,尤其是一些统一模型的情况下 ? ? DECLARE @i TimeBalance SET @i = CAST('0/102' AS TimeBalance) SELECT @i SELECT @i.ToString() SELECT @i.ToTimeString() SELECT @i.Distance() SELECT @i.Distance2('mi') ? ? SET @i = CAST('2015-1-1/2016-8-21' AS Tim