(轉載)20分鐘讀懂程序集

轉自:http://www.cnblogs.com/damonlan/p/3221347.html

說到程序集,我剛開始對這個名詞特別的郁悶!~。然后 前些天花了些時間 好好讀了一下,現在比較清晰了,把一些書上看到的 記下來,以饗讀者。希望沒浪費你們的時間。

一。程序集是什么

程序集,說白了就是一個 *.dll 或者 *.exe為后綴的文件。當然,如樓下朋友所說,是基于.NET平臺的!~。謝謝。

程序集,包括以下部分:

  • Windows 文件首部
  • CLR 文件首部
  • 元數據
  • 程序集清單
  • 可選的內嵌資源

Windows文件首部(知道有這么一個東西就行):就是告訴windows操作系統,本應用程序是ASP.NET 還是Winform還是控制臺應用程序。那怎么查文件首部信息呢?

打開VS的命令行工具 然后輸入

dumpbin/headers 項目名稱

程序集分為2類,私有程序集和共享程序集。

CLR 首部信息:運行于.NET 的程序都是需要這個標志哦!~如果需要查看它,也很簡單,

打開VS的命令行工具 然后輸入

dumpbin/clrheaders 項目名稱

元數據:元素就是.NET 編譯后的語言,我們可以打開ILDASM.exe 工具進行查看,然后再按Ctrl +M 打開元數據查看:

程序集清單:就是記錄這個程序包含了哪些dll程序以及這個版本是啥等等。。。

二。單文件程序集和多文件程序集

2.1單文件程序集

我們大多數的情況用的都是單文件程序集哦!。這個特別好理解,比如我們新建一個類庫工程,然后進行編譯,一般來說,編譯之后我們會得到一個 *.dll的文件,ok,這個就是單文件程序集啦!~

2.1多文件程序集

好,我們來說說多文件程序集。我們得知道,程序集由什么構成?是模塊。所以,多文件程序集就是有多個模塊構成的程序集。很遺憾的是,如果我們需要構建多文件程序集,VS IDE 是沒法做的,只能通過命令行的csc.exe 命令進行。真辛苦~~~。

(1)在記事本里 寫一段簡單的code,如下:

復制代碼
using System;namespace Person
{public class China{public void DisplayChinese(){Console.WriteLine("I'm Chinese");}}
}
復制代碼

然后,打開你VS 命令行,把上面的生成一個模塊,命令如下:

csc.exe /t:module China.cs

我們能看到生成了一個:China.netmodule的模塊文件。

(2),接著我們在新建一個文件,并且這個文件生成是dll文件。

復制代碼
using System;namespace Person
{public class Japan{public void DisplayJapanese(){Console.WriteLine("I'm Japanese");}}
}
復制代碼

(3)把剛China.netmodule模塊加入到剛需要生成的dll文件中。

命令是:

csc.exe /t:library /out:Lanny.dll Japan.cs /addmodule:China.netmodule

我們能看到生成了一個Lanny.dll的文件。。我們可以把這個文件引入到程序中進行測試。Ok,我們一個多文件程序集就這樣程序。但是,我感覺這樣的用處不大。

Japan j = new Japan();j.DisplayJapanese();Console.ReadKey();

能彈出“I'm Japanese”,說明我們引用成功了。

三。程序集的分類

程序集分為私有程序集和共享程序集

3.1私有程序集。

(1)啥是私有程序集。顧名思義,私 就是 私有的意思。就是我們新建的項目庫中保留的dll 都是私有程序集。比如,在我其中一個MyTestConsle的項目,在Bin/Debug里面都是私有程序集。

(2)配置私有程序集(probing 屬性)

一般情況下,我們需要dll,直接copy過去,是的,這樣很方便。但是,有的時候,我們需要把dll放到不同的文件中,那么這個時候,就需要進行配置。別擔心,特別的簡單哦。

比如,我們在C盤下面新建一個 MyTest的文件夾。我把剛的2個程序拷到這里來,并且點擊MyTestProject.exe,Ok,可以運行 這樣沒問題。。

但是,如果我新建一個“MyAllLibraries”文件夾,把我的Lanny.dll 文件放進去,如下圖,那我運行,我們都知道 肯定會報錯

咋辦呢?這個時候就需要我們去配置了。我們在MyTestProject.exe同級下新建一個“MyTestProject.exe.config”文件。入下圖:

MyTestProject.exe.config的內容是:

復制代碼
<?xml version="1.0" encoding="utf-8" ?>
<configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><probing privatePath="MyAllLibraries" /></assemblyBinding></runtime>
</configuration>
復制代碼

特別好理解,就是指明程序如果沒有找到這個dll文件,那么我去哪里尋找。。。這樣,我們就能順利運行了。不截圖了。

(3)使用VS IDE 進行配置

我們能新建Application Configuration File,然后進行配置。這個時候,它會自動把更新的內容更新到相應的 程序名.exe.config中。。

3.2共享程序集

?(1)了解共享程序集

上一節中,我們梳理了下私有程序集,現在我們說下共享程序集。那么它們之間最大的區別是什么呢?它們的本質區別是共享程序集的一個副本可供一臺機器上的多個應用程序使用。

比如,我現在新建一個 Windows Forms的程序,里面有一個“MessageBox.Show()”方法,可是很遺憾,你沒法再你新創建的應用程序下面找到:System.Windows.Forms.dll的引用,為啥?因為它是共享的程序集。不信 你看下圖,我沒騙你把。

那么共享文件部署到哪里呢?它安裝在GAC(Globle Assemble Cache)中,這個GAC? 在下面的目錄中。

(2)部署GAC--強命名

部署到GAC之前,一定要給這個程序集賦一個強命名,它就像是.NET中的GUID,是一個唯一標識符。它的作用是用于標識給定.NET二進制文件的發行者。

強命名的組成包括:

  • 程序集的友好名稱
  • 程序集的版本號
  • 公鑰值
  • 等等。。

那怎么生成強命名呢?有2種方法,一種是命令形式,另外一個VS 圖形化,最后的時候附帶上。

①生成強命名文件

sn.exe 工具生成一個文件 以 *.snk(strong name key)后綴的文件。

語法是:

sn -k 文件名.snk

②把強命名文件放進程序中

我們只需要把剛我們myTestKey.snk 告訴編譯器就好了。那怎么告訴呢?就是把信息寫進AssemblyInfo.cs 文件。

③安裝強命名的程序集

我們需要使用gacutil.exe 工具。

安裝:gacutil.exe -i 程序集名稱

查看:gacutil.exe -l 程序集名稱

卸載:gacutil.exe -u 程序集名稱

?現在我們打開“C:\Windows\assembly”的時候,我們并沒有找到剛MyLibrary.dll。原來在.NET 4中,GAC 被分在2個地方。.NET 1.0 到.NET 3.5的基礎類庫 就放到“C:\Windows\assembly”這里。而且.NET 4 編譯下的程序集,是放到“C:\Windows\Microsoft.NET\assembly\GAC_MSIL\”中。。

3.3 使用共享GAC

那我們就導入就好了!!。如果我們導入了一個共享的GAC,這個時候 我們沒法再本地程序集下面找到這個程序集,只能在剛我們所說的位置。

3.4圖形化配置GAC

①打開properties

我們選擇 <New ...>

②創建強命名文件

③顯示

轉載于:https://www.cnblogs.com/dirichlet/p/3325244.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據胸_喂母乳會導致胸下垂?!你被這個謠言騙了多少年?

很多人認為&#xff0c;給寶寶喂奶會導致胸下垂。有些愛美的媽媽&#xff0c;甚至在寶寶出生6個月后就著急斷奶。那么&#xff0c;喂奶真的會導致胸下垂么&#xff1f;給大家講兩個真實的調查結果哈~2004年的一次針對496名新媽媽的調查結果顯示&#xff0c;有75%的母乳喂養母親…

Spring Shell項目發布

Spring Source昨天發布了Spring Shell 。 Spring Shell是一個交互式Shell&#xff0c;可以使用基于Spring的編程模型輕松地通過命令進行擴展。 它是通過除去OSGi依賴項從Spring Roo項目中提取的&#xff0c;并變成了一個獨立項目。 這使得那些只希望使用交互式外殼功能的人更容…

自制ACL+DHCP實驗(初版)

&#xff08;實驗用gns模擬器&#xff09; ACL 實驗拓撲&#xff1a; 實驗要求&#xff1a; 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 實驗步驟&#xff1a; 步驟一&#xff1a;基本配置 R1&#xff1a; R1#conf t R1(config)#int lo0 R1(config-if…

pil 圖像最大值_第97天:圖像庫 PIL(二)

上節我們講了 Python 的圖像處理庫 PIL 的基本圖像處理功能&#xff0c;打開了 PIL 的神秘面紗。這節我們接著講 PIL 的 Image 模塊的常用方法。Image 模塊的方法convertImage.convert(modeNone, matrixNone, ditherNone, palette0, colors256)參數說明&#xff1a;mode&#x…

c#的委托用法delegate

轉載于:https://www.cnblogs.com/douzujun/p/6555886.html

yii2.0

yii是一個高性能的適用于開發web2.0應用的框架&#xff0c;它自帶豐富的功能&#xff0c;包括mvc&#xff0c;dao/aciverecord&#xff0c;緩存&#xff0c;身份驗證和基于角色的訪問控制&#xff0c;腳手架&#xff0c;測試等&#xff0c;可顯著縮短開發時間yii只加載你需要的…

Java中常見的代碼沖突

在工作中&#xff0c;最近我對現有Java項目進行了代碼清理。 完成該練習后&#xff0c;我可以看到在代碼中一次又一次地發生了一組常見的代碼沖突。 因此&#xff0c;我想出了此類常見違規的清單&#xff0c;并與同行分享&#xff0c;以使人們有意識地提高代碼質量和可維護性。…

np讀取csv文件_被 Pandas read_csv 坑了

-- 不怕前路坎坷&#xff0c;只怕從一開始就走錯了方向Pandas 是python的一個數據分析包&#xff0c;納入了大量庫和一些標準的數據模型&#xff0c;提供了高效地操作大型數據集所需的工具。Pandas 就是為解決數據分析任務生的&#xff0c;無論是數據分析還是機器學習項目數據預…

Python 第三方庫 cp27、cp35 等文件名的含義

What does version name ‘cp27’ or ‘cp35’ mean in Python? 如對于 gensim-0.12.4-cp27-none-win_amd64.whl文件名而言&#xff0c;將其文件名拆分的話&#xff0c;含義分別是&#xff1a; 0.12.4 - package version, they may be using semantic versioningcp27 - this p…

JAVA: 序列化

對象序列化 - 一個對象可以被表示為一個字節序列&#xff0c;保存對象的類型信息、對象的數據&#xff0c;還有對象中的數據類型&#xff0c;以便存儲或傳輸。 反序列化 - 將序列化對象寫入文件之后&#xff0c;可以從文件中讀取出來&#xff0c;并且對它進行反序列化&#xff…

尋找隨機的錯誤-一個真實的故事

幾周前&#xff0c;我完成了RapidFTR開源項目的錯誤查找 &#xff0c;這花了我三個晚上。 我認為可能值得分享狩獵的故事。 本文將介紹我的工作。 我將概述我的旅程&#xff0c;以實際找到正在發生的事情的根本原因。 我在本文中的目標是突出顯示可以使用的技術示例&#xff0c…

鈴木uy125摩托車機油_UY125 新瑞夢UM125發布 濟南鈴木于湖南株洲吹響國IV集結號...

?4月18日&#xff0c;濟南鈴木在湖南株洲天臺開元酒店舉行了2019年新品發布會&#xff0c;并于現場發布了兩款極具終端戰略意義的新款國IV車型&#xff0c;分別為定位“實用運動”的全新個性化踏板車型UY125&#xff0c;以及能夠進一步鞏固濟南鈴木在國IV入門級踏板車型領域絕…

473. 核電站問題

★ 輸入文件&#xff1a;nucle.in 輸出文件&#xff1a;nucle.out 簡單對比 時間限制&#xff1a;1 s 內存限制&#xff1a;128 MB 【問題描述】 一個核電站有 N 個放核物質的坑&#xff0c;坑排列在一條直線上。如果連續 M 個坑中放入核物質&#xff0c;則會發生爆炸&…

js判斷時間是早上還是下午_牛奶早上喝好,還是晚上喝好?沒想到“最佳時間”是這個點,顛覆了!...

都說喝牛奶好&#xff0c;要多喝。可什么時間喝牛奶最好呢&#xff1f;是飯前、飯后還是睡前&#xff1f;又或者喝酒前&#xff1f;確實得好好說說。傳言&#xff1a;空腹時身體比較缺能量&#xff0c;牛奶里的蛋白會去提供能量&#xff0c;不會去構成和修復組織(比如修復皮膚)…

Java模因拒絕死亡

也有標題&#xff1b; 我的寵物討厭Java編碼。 有許多Java模因讓我很煩&#xff0c;部分是因為它們總是一個壞主意&#xff0c;但主要是因為人們在找到更好的替代方案后的幾年里仍在繼續使用它們。 使用StringBuffer代替StringBuilder 從2004年開始&#xff0c;用于StringBuf…

Python TK編程第一部分 Hello Again

當你想寫大一點的程序的時候&#xff0c;將你的代碼封裝到一個或者多個類里會是一個不錯的辦法。下面hello world這個例子來自Matt Conway的Tkinter Life Preserver. [python]view plain copy from Tkinter import * class App: def __init__(self, master): …

視網膜脫離oct報告圖_剛剛,愛爾眼科發布關于艾芬醫生診療過程的核查報告

剛剛&#xff0c;愛爾眼科醫院集團發布關于艾芬女士診療過程的核查報告&#xff0c;內容如下&#xff1a;得悉艾芬女士對武漢愛爾眼科醫院白內障診療存疑&#xff0c;愛爾眼科醫院集團高度重視&#xff0c;第一時間成立了工作組奔赴武漢&#xff0c;對事件的診療全過程開展了核…

20145233《網絡對抗》第二周 后門原理與實踐

20145233《網絡對抗》第二周 后門原理與實踐 實驗內容 windows主機與kali虛擬機實現互聯互通使用netcat獲取主機操作Shell&#xff0c;cron啟動使用socat獲取主機操作Shell, 任務計劃啟動使用MSF meterpreter生成可執行文件&#xff0c;利用ncat或socat傳送到主機并運行獲取主機…

Spring 3.1:緩存和EhCache

如果在網上查找使用Spring 3.1內置緩存的示例&#xff0c;那么通常會碰到Spring的SimpleCacheManager &#xff0c;Spring的家伙說這對“用于測試或簡單的緩存聲明很有用”。 實際上&#xff0c;我更喜歡將SimpleCacheManager看作是輕量級的&#xff0c;而不是簡單的。 在您希望…

mysql-表完整性約束

閱讀目錄 一 介紹二 not null與default三 unique四 primary key五 auto_increment六 foreign key七 總結一 介紹 回到頂部 約束條件與數據類型的寬度一樣&#xff0c;都是可選參數 作用&#xff1a;用于保證數據的完整性和一致性主要分為&#xff1a; PRIMARY KEY (PK) 標識…