国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

CLR via C#

2019-11-17 03:07:06
字體:
供稿:網(wǎng)友

CLR via C# - CLR模型

博客園對markdown支持不佳,錯亂移步Github IO 博文

CLR 的執(zhí)行模型

模塊/程序集

1.模塊

托管模塊組成部分

  • PE32/PE32+頭 : PE即Portable Executable表示可執(zhí)行文件
  • CLR頭 : 包含所需的CLR版本,Main方法入口
  • 元數(shù)據(jù) : 元數(shù)據(jù)是一組數(shù)據(jù)表.其中的一些數(shù)據(jù)表描述了模塊中定義的內(nèi)容,比如類型或成員。還有一些描述了托管模塊引用的內(nèi)容,比如導(dǎo)入的類型、成員。
  • IL代碼

元數(shù)據(jù)用途

  1. 用于編譯,消除了C/CPP時期對頭文件的依賴
  2. VS IntelliSense,VS讀取程序集的元數(shù)據(jù),提供代碼提示
  3. 允許垃圾回收器追蹤對象的生存期,CLR GC采用的是Mark-Sweep形式,在mark階段,元數(shù)據(jù)可以提供某一對象的某一字段引用了哪個其他的對象,可以把引用的對象也mark一下,防止被GC回收

2.程序集

程序集是一個或多個模塊/資源 文件的邏輯分組。程序集是重用、安全性、以及版本控制的最小單元。一般認(rèn)為一個dll/exe是一個程序集,但是還可以生成多文件程序集,使用AL.exe

如何判斷是否安裝了.NET Framework,只需檢查%SystemRoot%/System32/MSCorEE.dll文件即可如圖,文件說明寫出是 .NET Runtime Execution Engine

執(zhí)行程序集中的代碼 JIT

當(dāng)一個方法第一次執(zhí)行時,CLR內(nèi)部的某個表會為該方法所在類型的所有方法創(chuàng)建一個記錄項,對應(yīng)著一個地址,在JIT編譯IL => Native code時查找IL代碼,JIT編譯好的Native Code存放在內(nèi)存中,并更新表中的地址,也就是下一次調(diào)用該方法時,直接執(zhí)行的是Native Code,不用再次經(jīng)過JIT了。這個不用是在一個程序的執(zhí)行時間內(nèi),要是將程序關(guān)閉了,再打開還得重來。.NET都是半解釋性性語言。

CTS : 通用類型系統(tǒng)CLS : 通用語言規(guī)范由于各個語言實(shí)現(xiàn)的不盡一致,MS定義了一個公共語言規(guī)范(Common Language Specification),它詳細(xì)定義了一個最小功能集.例如使用[assembly:CLSCompliant(tue)]指定此程序集是CLS兼容的

public UInt32 Abc()public int Xyz()public int xyz()

以上會得到警告,因為有的語言沒有unsigned int,而Xyz和xyz方法,是依靠大小寫來區(qū)分的,像VB 就不能區(qū)分這兩個方法.

在CLS中,類型的成員要么是一個字段,要么是一個方法,像是C#提供的屬性(PRoperty),事件(event)/委托(delegate)/運(yùn)算符重載 都是C#編譯器提供的,到IL層,只有字段和方法.delegate會變成一個類,這個另說.

程序集生成/打包/部署

csc.exe csharp compiler

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應(yīng)用程序
    3. library 生成dll
    4. module 生成.netmodule模塊,/addmodule:添加module引用
  • /reference: 或 /r 表示添加引用

csc hello.cs會生成hello.exe/out:hello.exe 和 /t:exe 是默認(rèn)的

CSC編譯時默認(rèn)引用MSCorLib.dll,可以指定/nostdlib使程序不默認(rèn)引用這個

響應(yīng)文件(.rsp)

在CSC編譯的時候,/r /t /out 命令可以保存在一個文件了,如MyProj.rsp

csc @MyProj.rsp hello.cs

還會在CSC.exe 相同目錄中查找一個全局的CSC.rsp文件,例如我的電腦上是C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.rsp里面Reference了一堆基本的dll,使用/noconfig指定編譯時忽略這個全局響應(yīng)文件

使用/r:xxx.dll來引用一個dll時,查找路徑為

  1. 工作目錄,當(dāng)前目錄
  2. CSC.exe所在目錄,MSCorLib.dll從這個文件獲取
  3. /lib編譯時指定 or LIB環(huán)境變量

將模塊合并成程序集

hello.cs

class Hello{public static void Main(){System.Console.WriteLine("Hello World ...");Method.AStaticMethod();}}

method.cs

public class Method{public static void AStaticMethod(){System.Console.WriteLine("Hello from another module ...");}}

執(zhí)行

csc /t:module method.cscsc /addmodule:method.netmodule hello.cshello

結(jié)果生成的netmodule文件是一個不包含清單元數(shù)據(jù)表的PE文件,添加到一個程序集后,這個netmodule不能刪除,刪除會拋出FileNotFoundException

未經(jīng)處理的異常:  System.IO.FileNotFoundException: 未能加載文件或程序集“method.netmodule”或它的某一個依賴項。系統(tǒng)找不到指定的文件。 ---> System.IO.FileNotFoundException: 系統(tǒng)找不到指定的文件。 (異常來自 HRESULT:0x80070002)   --- 內(nèi)部異常堆棧跟蹤的結(jié)尾 ---   在 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中配置

<configuration>    <runtime>        <assemblyBinding>            <probing privatePath="Private"...

強(qiáng)命名程序集

sn -k magicdawn.snk //創(chuàng)建一個snk,包含私鑰公鑰csc /keyfile:magicdawn.snk hello.cs

或者

sn -p magicdawn.snk magicdawn.PublicKey //創(chuàng)建兩個,publickey只包含公鑰sn -tp magicdawn.PublicKey //查看公鑰

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青海省| 东兴市| 乌鲁木齐县| 沧源| 平陆县| 临澧县| 乐清市| 平南县| 平塘县| 进贤县| 永康市| 龙井市| 陇川县| 尖扎县| 苍溪县| 镇平县| 长丰县| 怀柔区| 册亨县| 南陵县| 永胜县| 长泰县| 精河县| 兰溪市| 西华县| 肇庆市| 甘谷县| 崇文区| 岳西县| 郧西县| 西华县| 七台河市| 湛江市| 大安市| 杂多县| 从江县| 通江县| 金沙县| 阿合奇县| 双峰县| 英超|