C 高階程式設計八十三天 程式集的含義

2022-09-18 08:12:27 字數 4506 閱讀 2389

程式集的含義

一.程式集是包括乙個或多個型別定義檔案和資源檔案的集合

.它同意我們分析可重用型別的邏輯表示和物理表示

.相當於你定義了乙個專案xxproject,

專案存在非常多檔案(類

,視窗,介面

,資源等等

),編譯生成乙個

dll檔案

,就是程式集

.當你使用這個程式集的時候,

引用改程式及就能夠得到該程式集裡面的全部東西(類

,視窗,介面

,資源).程式集的特徵例如以下:

1.程式集定義了可重用的型別

2.程式集標識有乙個版本

3.程式集能夠包括與之相關的安全資訊

二.使用程式集的原因

(也就是使用多檔案集的原因

):1.能夠將型別分別實如今不同的檔案裡,

2.能夠依照須要向程式集中加入資源或資料檔案(

資料檔案能夠是任務格式

:文字檔案

,電子**

,word

文件等等

)3.能夠是我們建立的程式集包括一些用不同程式語言實現的型別.

注意:vs.net

計策後功能開發環境本身不支援建立多檔案程式集

,假設須要建立多檔案程式集

,必須求助於命令列工具

.csc  /t:module rut.cs           //生成

rut.netmodule

檔案 csc  /out:uniontype.dll  /t:library  /addmodule rut.netmodule  fut.cs  

//生成

uniontype.dll

類庫檔案

run.netmodule

檔案作為程式集的一部分來對待

三.程式鏈結器

程式鏈結器:assembly linker

即al.exe

使用前提:

假設我們要建立的程式集包括來自不同的編譯器生成的模組,而使用的編譯器又不支援類似於c

#中/addmodule

那樣的命令列開關,或者生成模組時還不知道程式集的打包需求,這時程式集鏈結器就顯示很實用。

使用例項:

csc /t:module rut.cs  

csc /t:module fut.cs  

al /out: uniontype.dll /t:library fut.netmodule rut.netmodule  

四.資源檔案的加入

1.使用

csc.exe

來加入資源檔案:

/resource 將把指定的資源檔案嵌入到產生的程式集

pe檔案裡。並更新

manifestresourcedef

表中的內容。

/linkresource 將向

manifestresourcedef

和filedef

清單表中加入一條目。使其指向乙個單獨的資源檔案。

2.使用

al.exe

來加入資源檔案:

/embed[resource]:該命令列接受不論什麼型別的檔案,將其內容嵌入到產生的

pe檔案裡。同一時候,清單中的

manifestresourcedef

表將被更新以反映該資源的存在。

/link[resource]:該命令將僅僅更新清單中的

manifestresourcedef

表和filedef

表,以反映資源的存在,並標識出程式集的哪個檔案包括著資源檔案。資源檔案本身不會被嵌入到程式集

pe檔案裡,它仍然保持獨立。而且須和其他程式一起打包、部署。

3.將win32

資源嵌入到程式集中:

通過al.exe

或csc.exe

加入/win32res

命令列開關指定乙個

.res

檔案路徑來實現。

通過al.exe

或csc.exe

加入/win32icon

命令列開關並指定乙個

.ico

檔案路徑來實現。

五、c#

程式集版本號資訊:

版本由四個部分組成:主版本、次版本、生成版本、修訂版本

例:2.5.719.2 

主版本號號與次版本號號組成「面向公眾」的版本號部分,第三個版本號號

719表示程式集的生成版本號,最後乙個版本號號

2表示對生成版本號的修訂版本號。

1、assemblyfileversion

: 該版本號號儲存在

win32

版本號資源中,它不過乙個輔助性的資訊。

2、assemblyinformationalversionattribute

:該版本號號也儲存在

win32

版本號資源中,僅輔助性作用。

3、assemblyversion

:該版本儲存在

assemblydef

清單元資料表中。

這個版本很重要,它用來惟一地標識乙個程式集。

六、語言文化:

不提倡建立包括**的衛星程式集,但還是有可能做到。假設我們願意,仍然能夠用system.reflection.assemblycultureattribute

定製特性來取代

al.exe

的/culture

命令列開關來指定語言文化。示比例如以下:

//將程式集的語言文化設定為瑞士德語

[assembly :

assemblyculture (

「de-ch」)]

通常情況下,我們建立的程式集不應該引用衛星程式集。也就是乙個程式集的assemblyref

條目指向的都應該是語言文化中性的程式集。假設想訪問乙個衛星程式集中的型別或成員,我們應該使用反射技巧。

衛星程式集:標識著特定語言檔案的程式集稱為衛星程式集。

七、共享程式集:

1..net

框架支援的兩種程式集:

弱命名程式集:weakly named assembly

強命名程式集:strongly named assembly

二者之間的真正差別在於:強命名程式集有乙個公布者的公鑰/

私鑰對簽名。當中的公鑰

/私鑰匙對惟一地標識了程式集的公布者。

強命名集包括四個惟一標識程式集的特性:檔名稱(沒有副檔名)、版本、語言文化標識和乙個公有金鑰標識。

例:」mytypes,version=1.0.8123.0,culture=neutral,publickeytoken=b77a5c561934e089

」2.強命名有用工具:

strong name utility即

sn.exe 

和.net

框架sdk

。以及visual studio .net

一起公布的乙個工具。

例:sn 

–k mycompany.keys

該命令告訴sn.exe

建立乙個名為

mycompany.keys

的檔案。

mycompany.keys

檔案將包括一對以二進位制格式儲存的公有金鑰和私有金鑰。

檢視公有金鑰:(

必須執行以下兩步

)sn –

p mycompany.keys mycompany.publickey

sn –

tp mycompany.publickey

建立強命名程式集:

[assembly: assemblykeyfile ( 「

mycompany.keys」)]

3.程式集的兩種部署方式:即私有部署方式和全域性部署方式

私有部署方式將程式集部署在應用程式的基資料夾及其子資料夾下,弱命名程式集僅僅能進行私有部署。

全域性部署方式將程式集部署在一些clr

確知的地方。

強命名程式集既能夠進行私有部署。也能夠進行全域性部署。

4.system.reflection.assemblyname

類:利用它。我們能夠非常easy地建立乙個程式集名稱,並獲取乙個程式集名稱的各個部分。公有例項屬性:如cultureinfo

、fullname

、keypair

、name

以及version.

該類提供了幾個公有例項方法,如

getpublickey

、getpublickeytoken

、setpublickey

、以及setpublickeytoken

。八、其它

元資料標識是乙個4

位元組的數值。其高位位元組表示標記的型別(

0x01 = typeref ,0x02 =typedef, 0x26 = filedef , 0x27 = exportedtype

)為使我們建立的c#

程式集出如今

.net

選項卡的列表中。能夠將以下的子鍵加入到登錄檔中:

hkey_local_machine\software\microsoft\.netframework\

Lua程式設計(八十三)

lua是一種安全的語言,這意味著不管用lua寫什麼,也不管寫出來的內容有多麼不正確,lua自身所提供的機制總是能用來理解程式的行為。此外,程式中的錯誤 error 也是通過lua語言的機制來檢測和解釋的。與之相對的是,許多c語言 中的錯誤只能從底層硬體的角度來解釋 例如,把異常位置作為指令位址給出 ...

C 高階程式設計十三天 方法的過載

c 支援方法的過載 方法的幾個版本有不同的簽名即可 即 方法名相同 但是引數個數和 或型別不同 為了衝在方法 只需要宣告同名單引數個數或型別不同的方法即可.注意 兩個方法不能僅在返回型別上有區別.兩個方法不能僅根據宣告為ref 還是out 來區分.屬性的概念是 以個方法貨一堆屬性 在客戶端 看來 他...

iOS 高階 第十三天 0414

畫線 圓和圓弧的第二種方法 5中方法畫矩形 第二種畫圖形的方法 之前做的方法都是先把要畫的元素快取到圖形上下文cgconteextref中去,現在第二種方法也快取到cgpath中去.其實圖形上下文本質也是在內部建立乙個cgpath,圖形上下文把所有的元素先快取到cgpath中去,然後cgpath再快...