2.1 .NET Framework部署目標
非.NET程序的問題:
1.DLL hell
2.安裝復雜。目錄分散,注冊表,快捷方式
3.安全性。悄悄下載惡意代碼
2.2 將類型集成到模塊中——編譯器工具csc
csc /out:Program.exe /t:exe /r:Mscorlib.dll Program.cs
由於C#會自動引用Mscorlib.dll,可以省略 /r:Mscorlib.dll
C#默認生成exe(CUI), 所以/t:exe可以省略;dll(程序集 /t:library)和GUI(可視化應用程序 /t:winexe)時不可以省略
C#默認編譯成Program.exe,所以/out:Program.exe可以省略
最後精簡為:
csc Program.cs
如果不希望默認引用Mscorlib.dll,使用/nostdlib開關
csc /nostdlib Program.cs
注:/t可以寫為/target,/r可以寫為/reference
/reference:指定引用的dll,可以使用完整路徑;如果是不完整的,在以下目錄依次查找:
1.工作目錄(要編譯的cs文件所在)
2.系統目錄(csc.exe所在)
3./lib開關指定的目錄
4.LIB系統變量指定的目錄
應答文件(Response File)
包括一系列編譯器命令行開關,執行csc時會將其打開,例如MyProject.rsp中有以下文本:
/out:Program.exe
/t:exe
/r:Mscorlib.dll
那麼調用如下:csc @MyProject.rsp Program.cs
這個應答文件的位置,運行csc命令時,先在當前目錄(Program.cs所在)查找;後在系統目錄(csc.exe 所在)查找,如果都有就以前者為准
使用/noconfig開關指定忽略rsp文件
2.3 元數據概述
3種類別的表:定義表,引用表,清單表
1.常見的定義表:ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef, EventDef
2.常見的引用表:AssemblyRef,ModuleRef,TypeRef,MemberRef
3.常見的清單表:AssemblyDef,FileDef,ManifestResourceDef,ExportedTypesDef
2.4 合並模塊以構成一個程序集
CLR總是首先加載包含清單表的文件,然後使用這個清單,加載其他文件。
使用多文件程序集的3個理由:
1.按類別劃分類型,放到不同的程序集中
2.可以添加資源/數據文件,使用AL.exe,使其成為程序集的一部分
3.程序集的各個類型可以使用不同的語言來實現,然後使用ILAsm生成IL
csc /t:module A.cs 指示編譯器生成不含清單表的清單文件,一般總是一個DLL,生成的文件為 A.netmodule
接下來,要把這個netmodule文件附加到一個有清單表的程序集中,使用addmodule開關:
csc /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.cs 這裡B.cs包含清單表,最終 生成FinalAssmbly.dll,如果A.netmodule不存在,便一起會報錯。但是運行程序時,A.netmodule可以不 存在,僅在調用其中的方法時,才會加載A.netmodule
VS2005不支持創建多文件程序集。
VS2005中添加引用的“.NET選項”,對應注冊表中 HKEY_LOCAL_MACHINE\SOFTARE\Microsoft\.NETFramework\AssemblyFolders\,動態添加鍵值,VS2005可 以在對應的目錄下找到dll,並加載到“.NET選項”中。
IL中 Token:0x26000001,000001代表行號,0x26代表FileRef,此外0x01=TypeRef,0x02=TypeDef, 0x03=AssemblyRef,0x27=ExportedType。
AL.exe程序集鏈接器
生成一個DLL,只包括一個清單文件,不包含IL代碼,以下生成的是FinalAssmbly.dll:
AL /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.netmodule
還可以生成CUI或GUI,但很少這麼做,因為要添加/main開關,指定入口方法:
AL /out:FinalAssmbly.dll /t:exe /main:Program.Main /addmodule:A.netmodule B.netmodule
在程序集中包含資源文件,書上講到了3個開關:
/embled[resource] 嵌入到程序集中,更新清單表的ManifestResourceDef——對應csc的/resource 開關 /link[resource] 並不嵌入到程序集中,更新清單表的ManifestResourceDef和FileDef,對應csc 的/linkresource開關 /win32res 嵌入標准的Win32文件 /win32icon 嵌入ico文件
2.5 程序集版本資源信息
使用System.Diagnostics.FileVersionInfo的靜態方法GetVersionInfo獲取這些信息。在VS2005中, 這些信息存放在AsseblyInfo.cs中。
使用AL生成程序集時,可以指定開關,來配置這些信息,表從略(見書)
2.6 語言文化
附屬程序集satellite assembly,使用一種具體的語言文化來標記的程序集。
使用AL時,通過/[culture]: text來指定語言文化,這裡text為en-US,zh-CN等等。也可以直接寫在 程序集中,使用自定義屬性:
[assembly:AssemblyCulture("en-US")]
使用System.Resource.ResourceManager來訪問附屬程序集的資源。
2.7 簡單應用程序部署
這一節講的是私有部署方式(private deployed assembly),即部署到和應用程序相同的目錄中的程序 集
2.8 簡單管理控制
CLR定位程序集A時,
對於中性neatual語言文化,按照配置文件privatePath屬性順序,先後掃描privatePath指定的目錄, 直到找到所需:先找A.dll,如下:
AppDir\AsmName.dll
AppDir\AsmName\AsmName.dll
AppDir\firstPrivatePath\AsmName.dll
AppDir\firstPrivatePath\AsmName\AsmName.dll
AppDir\secondPrivatePath\AsmName.dll
AppDir\secondPrivatePath\AsmName\AsmName.dll
如果沒有,重頭再來找A.exe
附屬程序集遵循同樣規則,只是目錄變為privatePath+"文化名稱(如en-US,先找dll,再找exe;如果 沒有找到,就把文化名稱改為en,重頭再來)"