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

2021-05-10 14:07:31 字數 3320 閱讀 8454

2.1 .net framework部署目標

非.net程式的問題:

1.dll hell

2.安裝複雜。目錄分散,登錄檔,快捷方式

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_machinesoftaremicrosoft.netframeworkassemblyfolders,動態新增鍵值,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,如下:

如果沒有,重頭再來找a.exe

附屬程式集遵循同樣規則,只是目錄變為privatepath+"文化名稱(如en-us,先找dll,再找exe;如果沒有找到,就把文化名稱改為en,重頭再來)"

Python學習筆記(2) 生成隨機數

python中的random模組提供了一些很有用的方法來幫我們生成隨機數。接下來我們來看一下random模組中都包括哪些方法。randint方法接收兩個整型引數a和b,其中第乙個引數必須小於第二個引數 可以等於,但是沒有意義 然後返回乙個大於等於a且小於等於b的隨機整數。下面可以生成0到5的隨機整數...

NLP學習筆記15 生成句子

本文屬於nlp學習筆記系列。當乙個模型訓練好後,我們可以利用這個模型來生成一些資料,就是生成模型。例如 生成句子,影象,程式等。當然還有判別模型。語言模型屬於生成模型,所以可以生成句子。下面的例子,假如有個詞庫,然後每乙個詞對應的概率已經訓練好了,然後用unigram來生成乙個句子 由於unigra...

Docker學習筆記3 生成映象

通過編寫dockerfile檔案,我們可以利用docker來製作自己的映象檔案。命令格式如下 docker build t 映象名 dockerfile檔案所在資料夾路徑 t表明後面引數是映象的映象名。執行完該命令就根據dockerfile中的配置生成了我們需要的映象檔案。dockerfile詳解 ...