.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,因此,就算這個普通模塊不存在也無所謂。







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