程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> CLR筆記:2.生成,打包,部署,管理

CLR筆記:2.生成,打包,部署,管理

編輯:關於.NET

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,重頭再來)"

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved