.Net 託管模組與程式集的關係
阿新 • • 發佈:2019-01-25
一、基本概念:
--託管模組:一個標準的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,因此,就算這個普通模組不存在也無所謂。
--程式集:由一或者多個模組/資原始檔的邏輯性組合。程式集是重用、安全性以及版本控制的最小單元。 可以將.exe與.dll檔案認為是一個程式集;其中.exe檔案是一個自己執行的程式集,而.dll將被其他程式集載入後執行。
二、模組與程式集概念的類比 一個專案的開發團隊,會有一個或者是多個的“成員”組成,這些“成員”裡必定會有一個負責人。團隊外部的人要和這個團隊打交道,他們只需要知道這個團隊的負責人即可。因為這個負責人“成員”知道這個團隊內部的一切情況。在很多情況下,團隊外部的人員會以負責人的名稱來稱呼這一個團隊。在這裡,團隊是一個邏輯的概念,並不是特指某個人或資源。 團隊 = 程式集 負責人 = 主模組(下面會說明與普通模組的區別) 成員 = 普通模組 在很多情況下,我們會用主模組的特徵(如名稱)來稱呼一個程式集。即(用負責人“成員”的特徵來稱呼一個團隊) 三、模組與程式集的生成 1、cs檔案 假設我有兩個.cs的類庫檔案,和一個包含Main方法的.cs檔案,都放在D:\test資料夾中。分別為: Cat.cs: using System;
將會在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;
執行Program.exe,結果:
現在將Cat.netmodule刪除:
執行Program.exe,結果:
原因是:CLR並沒有載入Cat.netmodule,因此,就算這個普通模組不存在也無所謂。