1. 程式人生 > >.Net 託管模組與程式集的關係

.Net 託管模組與程式集的關係

一、基本概念: --託管模組:一個標準的32的可移植執行體(PE32)檔案或一個標準的64位可移植執行體(PE32+)檔案。由用支援CLR的任何一種語言建立的原始碼檔案,再經過相應的編譯器檢查語法和分析原始碼,編譯生成。如下:
--程式集:由一或者多個模組/資原始檔的邏輯性組合。程式集是重用、安全性以及版本控制的最小單元。     可以將.exe與.dll檔案認為是一個程式集;其中.exe檔案是一個自己執行的程式集,而.dll將被其他程式集載入後執行。
二、模組與程式集概念的類比     一個專案的開發團隊,會有一個或者是多個的“成員”組成,這些“成員”裡必定會有一個負責人。團隊外部的人要和這個團隊打交道,他們只需要知道這個團隊的負責人即可。因為這個負責人“成員”知道這個團隊內部的一切情況。在很多情況下,團隊外部的人員會以負責人的名稱來稱呼這一個團隊。在這裡,團隊是一個邏輯的概念,並不是特指某個人或資源。     團隊 = 程式集     負責人 = 主模組(下面會說明與普通模組的區別)     成員 = 普通模組     在很多情況下,我們會用主模組的特徵(如名稱)來稱呼一個程式集。即(用負責人“成員”的特徵來稱呼一個團隊) 三、模組與程式集的生成 1、cs檔案 假設我有兩個.cs的類庫檔案,和一個包含Main方法的.cs檔案,都放在D:\test資料夾中。分別為: Cat.cs: using System;
namespace Animal {     public class Cat     {         public void Print()         {             Console.WriteLine("cat");         }     } } Dog.cs: using System; namespace Animal {     public class Dog     {         public void Print()         {             Console.WriteLine("dog");         }     }
} Program.cs using Animal; public class Program {     static void Main(string[] args)     {         new Dog().Print();         new Cat().Print();     } } 2、生成類庫程式集 現在可以將這兩個.cs檔案生成相應的模組,利用csc.exe編譯器: csc /t:module /out:D:\test\Cat.netmodule D:\test\Cat.cs csc /t:module /out:D:\test\Dog.netmodule D:\test\Dog.cs 這個會在D:\test目錄下生成兩個普通模組: Cat.netmodule Dog.netmodule 由於CLR是以程式集作為最小單元進行載入的,為了使Program.cs檔案能夠正常地呼叫Cat.netmodule與Dog.netmodule/現將這兩個檔案生成一個程式集。由於這個程式集是一個被其他程式集載入的,因此,生成的檔名可以為:Animal.dll csc /out:D:\test\Animal.dll  /t:library /addmodule:D:\test\Cat.netmodule;D:\test\Dog.netmodule 執行此命令之後,會在D:\test目錄下生成Animal.dll 上面的各個模組中: 主模組(負責人):Animal.dll 普通模組(成員): Cat.netmodule, Dog.netmodule。 程式集(團隊):由主模組Animal.dll與普通模組Cat.netmodule、Dog.netmodule組成。但是在一般情況下我們會將Animal.dll稱為程式集。特別是在IDE 的visual studio的生成的情況下,因為在IDE預設生成的dll中,已經將各個模組包含進dll中,除了dll中,並沒有其他的模組檔案。 在這裡,我們可以執行命令: csc /out:D:\test\Animal.dll /t:library D:\test\Cat.cs D:\test\Dog.cs直接生成Animal.dll檔案,此時將不再生成Cat.netmodule與Dog.netmodule檔案; 3、exe呼叫dll 執行命名: csc /out:D:\test\Program.exe /R:D:\test\Animal.dll D:\test\Program.cs    
將會在D:\test生成Program.exe可執行檔案 注意:這裡的Animal.dll檔案代表的是一個程式集,如果這個程式集由多個檔案組成,必須保證其他檔案都存在,否則編譯會失敗。如當程式集由主模組Animal.dll、普通模組Cat.netmodule與Dog.netmoudle組成時,必須保證這三個檔案同時存在。 在命令列中可以直接執行: Program.exe 輸入結果:     dog
    cat 4、一個程式集多個模組的作用     CLR是以程式集為單位進行載入的。但是,CLR只會載入被引用到的模組,沒有引用的模組不會載入。因此,可以將程式集分為多個模組,執行程式時,只要保證有被引用到的模組存在即可,可以減少載入的程式集檔案大小;特別是當程式集是通過網路傳輸載入時。
示例:     修改Program.cs檔案,使它不再引用Cat.cs檔案中的型別
using Animal;
public class Program {     static void Main(string[] args)     {         new Dog().Print();          // new Cat().Print();     } } 重新編譯Program.cs檔案: csc /out:D:\test\Program.exe /R:D:\test\Animal.dll D:\test\Program.cs    現在在D:\test資料夾中具有檔案如下:
執行Program.exe,結果:
現在將Cat.netmodule刪除:
執行Program.exe,結果:
原因是:CLR並沒有載入Cat.netmodule,因此,就算這個普通模組不存在也無所謂。