程序集與託管模塊的概念 .NET

程序集與託管模塊的概念 .NET

 注意:執行csc.exe時,有可能會出現CS1567:即沒有權限,因爲csc.exe的很多生成的文件都放在csc.exe所在的目錄下,該目錄要求管理員權限。可以利用/out:位置 來指定生成的結果文件應該放在哪個位置。這樣可以避開權限的問題。


本文是爲了對程序集和託管模塊加深理解而整理的資料,希望大家看了此篇文章後對程序集和託管模塊的概念更清楚一點。

如果你正在開發面向DotNet平臺的應用程序,那麼你肯定對“程序集”和“託管模塊”這兩個概念不陌生,這是DotNet帶來的術語。這兩個概念很容易混淆,有人認爲它們指的是同一樣事物,其實不然。這裏,我寫下自己的一些理解。

爲了便於說明問題,我們先看看一個公司的某項目開發團隊,這個“團隊”由團隊“成員”組成(可能還有一些資源),而在這些團隊成員中,必然有一個成員是這個團隊的頭頭,爲了表示不是普通的成員,頭頭都有一個稱號,比如說“經理”或者“負責人”。經常的,說到某個團隊,我們只要知道它的頭頭就可以了。也就是說,頭頭代表了這個團隊(注意,這裏是"代表")。如果其他人有什麼事情要與這個團隊交流(比如團隊向外說明本團隊完成了什麼任務等),沒有必要將每個成員找來交流,我們只要找到頭頭就可以了。因爲頭頭知道本團隊的一切,他掌握了關於團隊的所有信息:本團隊有哪些成員,而且有些什麼資源可以利用,與其他哪些團隊有交流等等。常見的團隊有多個成員,一個成員的團隊是不多見的。但爲了說明問題,我們假定一個成員的團隊和多個成員的團隊都存在。

從上面的討論中我們可以這樣總結:團隊是個邏輯概念,並不是指某個人或資源,它是一個集合,而且這個集合不爲空,只有當擁有大於或者等於多個成員的時候它才稱之爲團隊。

嘿,大家看出來了,我之所以要說項目開發團隊和成員,是因爲在DotNet中的程序集和託管模塊的概念與此類似。程序集其實並不是說某個文件,它是一個邏輯概念,就像一個團隊。當然,我們習慣說a.exe 或者b.dll是個程序集,其實這樣說多少會讓人混淆,請看下面的說明。而託管模塊就像是團隊中的團隊成員。哈,你肯定想到了,其中必然有一個託管模塊是整個“團隊”的“頭頭”,它負責管理所有的託管模塊,關於這個程序集的一些信息也保存在這個託管模塊中。我們把這樣的模塊叫做“主託管模塊”(我記得某本書上是這樣叫的)。爲了區分主託管模塊和普通託管模塊,怎麼辦呢?我們給普通託管模塊和主託管模塊不同的後綴名,普通託管模塊的後綴名是.netmodule,而主託管模塊的後綴名是.exe 或者.dll。和開發團隊中頭頭代表整個團隊一樣,主託管模塊代表着整個程序集。既然是主託管模塊,那麼它肯定與其他託管模塊不一樣。一般的託管模塊包含有IL代碼和元數據,而這個主託管模塊有沒有IL代碼和元數據並不重要,但它一定要有“清單”,也就是關於整個程序集的數據。

爲什麼主託管模塊會有兩種後綴名呢?這是因爲分工的原因,有的程序集是爲其他程序集提供便利的,它實現了一些數據類型(類庫)或者擁有某些資源――這就是後綴名爲.dll的程序集。這樣的程序集不喜歡拋頭露面,它們是“幕後程序集”。另一種程序集,後綴名爲.exe,用戶直接和它們打交道。有的功能它自己實現,但有些呢就交給幕後程序集去實現。爲了區別,我們就把這樣的程序集叫做“前臺程序集”吧。DotNet規範中沒有這兩個概念,這裏是爲了理解才造的詞。當然,讀者朋友都會有自己比較習慣的理解名字。一個可執行應用程序中,只有一個前臺程序集的概念,但是可以有零個或一個或多個幕後程序集。

我們又回到實際生活中的開發團隊概念上來。團隊的組成有這樣幾種情況:

n 一個成員,這樣的成員是比較厲害的那種,比如個人軟件開發者,自己對自己負責,自己是自己的頭頭;

n 多個成員,其中某個成員是頭頭;

程序集與此類似,所以就有了單模塊和多模塊程序集(有時也稱單文件程序集和多文件程序集)。如果要實現的功能不是很煩雜,那麼就用單模塊程序集吧;但是,如果要實現的功能比較多,而且也好分開,那麼建議你用多模塊程序集;如果以後某個功能的實現方案改變的話,只要修改這個模塊就行了,這樣一來,極大的降低了開發的繁雜度。還有幾點要注意,有的託管模塊並不實現某種計算功能,它們僅僅是提供一些資源,比如說字符串;有時程序集除了包含託管模塊外,還包含一些另外的資源文件。

我相信現在大家對程序集和託管模塊分別是什麼以及兩者間的關係有了較好的理解。但是如果有源代碼輔助一下那就更好了。是的。對程序員來說,源代碼比什麼都親切。好的,下面就舉兩個簡單的例子(用C#語言表述)。一個是單模塊程序集,一個是多模塊程序集。兩者都是前臺程序集(後綴名是exe)。我用Visual C# 2003 集成開發環境試了一下,竟然發現它不支持多程序集的開發(希望是我沒有找到)。沒關係,我們還有DotNet FrameWork SDK呢,不用怕。它自帶的C#編譯器csc.exe很好用。至於csc的用法我就不多說了。

 

例子1。單模塊程序集:

首先找個文本編輯器,將下面的代碼敲進去,然後將它保存起來,取名爲hello.cs。例如我把它存爲e:\test\hello.cs。

usingSystem;

namespacensApp{

   public class CEnterPoint    {

      static void Main()       {

          Console.WriteLine("Hello, verybody!");

      }

   }

}

  然後,打開SDK命令行提示,定位在hello.cs所在的文件夾,比如我的是e:\test。在命令行提示中輸入命令 csc hello.cs,這個命令默認的是生成 .exe文件,也就是一個主託管模塊。現在到hello.cs所在的文件夾中看看,你會發現一個新文件hello.exe。好,一個主託管模塊誕生了。既然有主託管模塊,那麼就標誌着一個程序集的誕生。再看看,沒有其他的託管模塊,那麼這個程序集就是一個單模塊程序集。

 

  例子2。多模塊程序集:

假設我們要編一個程序來管理動物園。這裏爲了簡單,不考慮繼承等問題,每個動物用一個類來表示,並且用一個託管模塊來實現。將所有的動物都放在命名空間nsZoo中。現在動物園有兩種動物:Dog和Cat。看下面的代碼:

usingSystem;

 

namespacensZoo{

   public class Dog {

      public void SayHello(){

          Console.WriteLine("I am a dog, wang wang wang");

      } 

   }

}

 

usingSystem;

 

namespacensZoo{

   public class Cat{   

      public void SayHello(){

          Console.WriteLine("I am a cat, miao miao miao");

      }

   }

}

 

usingSystem;

using nsZoo;

 

namespacensApp{  

   class CEnterPoint{   

      static void Main(string[] args){   

          Dog aDog = new Dog();

          Cat aCat = new Cat();

 

          aDog.SayHello();

          aCat.SayHello();

 

          Console.ReadLine();

      }

   }

}

將上面的三個文件保存好,比如放在文件夾e:\zoo 中。再一次打開SDK命令行提示,定位到e:\zoo  

輸入命令 csc /t:module Dog.cs 看看文件夾,你會發現一個新文件 Dog.netmodule

哈,這是一個託管模塊,普通的託管模塊。

接着輸入命令 csc /t:module Cat.cs 同樣得到一個普通託管模塊 Cat.netmodule 。好現在有了兩個普通託管模塊。

爲了實現一個程序集的夢想,必須還要有一個主託管模塊。好,接着輸入

csc /addmodule:Dog.netmodule;Cat.netmodule Main.cs 你會在文件夾中發現一個名爲Main.exe的文件,這就是你想要的主託管模塊。

好了。現在你有三個託管模塊,並且任命其中一個爲主託管模塊,這樣你就擁有了一個程序集了。這個程序集的組成是:Dog.netmodule, Cat.netmodule, Main.exe 。我們習慣說這個程序集是Main.exe 。但是一定要知道,Main.exe 其實是一個程序集的“頭頭”,由它代表着整個程序集。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章