解決非 .NET 程式三大痛點:DLL Hell、安裝複雜(目錄分散、登錄、捷徑)、安全性(惡意碼悄悄下載)。
csc /out:Program.exe /t:exe /r:Mscorlib.dll Program.cs
Mscorlib.dll,可省略 /r。/t:exe 可省略;DLL (/t:library) 與 GUI (/t:winexe) 不可省略。Program.exe,/out 可省略。精簡為 csc Program.cs。Mscorlib 用 /nostdlib。/t = /target,/r = /reference。/reference 搜尋順序:工作目錄 → 系統目錄 → /lib 目錄 → LIB 環境變數目錄。應答檔:包含編譯器命令列開關,csc @MyProject.rsp Program.cs。搜尋順序:目前目錄 → 系統目錄。/noconfig 忽略 rsp 檔。
三類資料表:定義表、引用表、資訊清單表。常見定義表:ModuleDef, TypeDef, MethodDef, FieldDef, ParamDef, PropertyDef, EventDef。常見引用表:AssemblyRef, ModuleRef, TypeRef, MemberRef。常見清單表:AssemblyDef, FileDef, ManifestResourceDef, ExportedTypesDef。
CLR 優先載入含資訊清單的檔案,再用清單載入其他檔案。使用多檔案組件三理由:按類別劃分型別、加入資源/資料檔案(AL.exe)、不同語言實作型別再用 ILAsm 產生 IL。
csc /t:module A.cs 產生無清單的模組檔 A.netmodule。csc /out:FinalAssembly.dll /t:library /addmodule:A.netmodule B.cs 附加至有清單的組件(B.cs 含清單)。執行期 A.netmodule 可不存在,僅呼叫其方法時載入。0x26000001 (行號 1, 0x26=FileRef);0x01=TypeRef, 0x02=TypeDef, 0x03=AssemblyRef, 0x27=ExportedType。AL.exe 組件連結器:產生僅含清單的 DLL(無 IL)。AL /out:FinalAssembly.dll /t:library /addmodule:A.netmodule B.netmodule。可產生 EXE 需 /main 指定進入點。資源檔案開關:/embed[resource] (內嵌)、/link[resource] (連結)、/win32res, /win32icon。
System.Diagnostics.FileVersionInfo.GetVersionInfo 取得。VS2005 存放於 AssemblyInfo.cs。AL 可用開關配置(詳見書本)。
附屬組件:以具體文化特性標記的組件。AL /culture:text (如 en-US, zh-CN) 或組件屬性 [assembly:AssemblyCulture("en-US")]。用 System.Resources.ResourceManager 存取附屬組件資源。
私有部署:組件部署在應用程式相同目錄。
CLR 定位組件 A(中性文化):依設定檔 privatePath 順序掃描:AppDir\AsmName.dll → AppDir\AsmName\AsmName.dll → AppDir\firstPrivatePath\AsmName.dll → ... 找不到再找 .exe。附屬組件同規則,目錄加文化名稱(en-US → en)。