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詳解 ...