博客園對markdown支持不佳,錯亂移步Github IO 博文
模塊/程序集
程序集是一個或多個模塊/資源 文件的邏輯分組。程序集是重用、安全性、以及版本控制的最小單元。一般認為一個dll/exe是一個程序集,但是還可以生成多文件程序集,使用AL.exe
如何判斷是否安裝了.NET Framework,只需檢查%SystemRoot%/System32/MSCorEE.dll
文件即可如圖,文件說明寫出是 .NET Runtime Execution Engine
當一個方法第一次執行時,CLR內部的某個表會為該方法所在類型的所有方法創建一個記錄項,對應著一個地址,在JIT編譯IL => Native code時查找IL代碼,JIT編譯好的Native Code存放在內存中,并更新表中的地址,也就是下一次調用該方法時,直接執行的是Native Code,不用再次經過JIT了。這個不用是在一個程序的執行時間內,要是將程序關閉了,再打開還得重來。.NET都是半解釋性性語言。
CTS : 通用類型系統CLS : 通用語言規范由于各個語言實現的不盡一致,MS定義了一個公共語言規范(Common Language Specification)
,它詳細定義了一個最小功能集.例如使用[assembly:CLSCompliant(tue)]
指定此程序集是CLS兼容的
public UInt32 Abc()public int Xyz()public int xyz()
以上會得到警告,因為有的語言沒有unsigned int,而Xyz和xyz方法,是依靠大小寫來區分的,像VB 就不能區分這兩個方法.
在CLS中,類型的成員要么是一個字段
,要么是一個方法
,像是C#提供的屬性(PRoperty),事件(event)/委托(delegate)/運算符重載 都是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 是默認的
CSC編譯時默認引用MSCorLib.dll,可以指定/nostdlib
使程序不默認引用這個
在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
指定編譯時忽略這個全局響應文件
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 ...");}}
執行
csc /t:module method.cscsc /addmodule:method.netmodule hello.cshello
結果生成的netmodule文件是一個不包含清單元數據表的PE文件,添加到一個程序集后,這個netmodule不能刪除,刪除會拋出FileNotFoundException
未經處理的異常: System.IO.FileNotFoundException: 未能加載文件或程序集“method.netmodule”或它的某一個依賴項。系統找不到指定的文件。 ---> System.IO.FileNotFoundException: 系統找不到指定的文件。 (異常來自 HRESULT:0x80070002) --- 內部異常堆棧跟蹤的結尾 --- 在 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 //創建一個snk,包含私鑰公鑰csc /keyfile:magicdawn.snk hello.cs
或者
sn -p magicdawn.snk magicdawn.PublicKey //創建兩個,publickey只包含公鑰sn -tp magicdawn.PublicKey //查看公鑰
新聞熱點
疑難解答