博客園對markdown支持不佳,錯亂移步Github IO 博文
模塊/程序集
程序集是一個或多個模塊/資源 文件的邏輯分組。程序集是重用、安全性、以及版本控制的最小單元。一般認(rèn)為一個dll/exe是一個程序集,但是還可以生成多文件程序集,使用AL.exe
如何判斷是否安裝了.NET Framework,只需檢查%SystemRoot%/System32/MSCorEE.dll
文件即可如圖,文件說明寫出是 .NET Runtime Execution Engine
當(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會變成一個類,這個另說.
class Hello{public static void Main(){System.Console.WriteLine("Hello World ...");}}
csc /out:hello.exe /target:exe hello.cs
/target 或者 /t 表示輸出類型
/addmodule:
添加module引用/reference: 或 /r 表示添加引用
csc hello.cs
會生成hello.exe/out:hello.exe 和 /t:exe 是默認(rèn)的
CSC編譯時默認(rèn)引用MSCorLib.dll,可以指定/nostdlib
使程序不默認(rèn)引用這個
在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)文件
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 /t:library /out:example.dll a.netmodule b.netmodule
使用/link[resource]連接資源/resource 嵌入資源
探測目錄
privatePath在app.config中配置
<configuration> <runtime> <assemblyBinding> <probing privatePath="Private"...
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 //查看公鑰
新聞熱點(diǎn)
疑難解答