2012-02-14 67 views
40

我一直試圖圍繞'正確的'回答這個問題?關於這個問題,有幾個關於stackoverflow的話題,但是與msdn文檔有些衝突。在第2回答他的問題圖.NET模塊與組件

例如,注意:What is a Managed Module (compared to an Assembly)?

現在看看MSDN圖:http://msdn.microsoft.com/en-us/library/zst29sk2(VS.100).aspx

在MSDN圖意味着,單個文件的彙編不包括的模塊,而是清單,il代碼,類型元數據等。 這與我讀過的許多其他文章不同,其中指出單個文件程序集有一個模塊。

答案是?如果答案是'both',那麼模塊是一個單獨的物理文件,通過程序集清單鏈接?

+0

可能的重複[什麼是在.NET中的模塊?](http://stackoverflow.com/questions/645728/what-is-a-module-in-net) – 2014-02-05 21:51:21

回答

31

每個組件具有至少一個模塊。這是一個高度隱形的實現細節。但是當你使用Reflection.Emit時你可以看到它。從用於AssemblyBuilder class示例代碼:

AssemblyName aName = new AssemblyName("DynamicAssemblyExample"); 
AssemblyBuilder ab = 
    AppDomain.CurrentDomain.DefineDynamicAssembly(
     aName, 
     AssemblyBuilderAccess.RunAndSave); 

// For a single-module assembly, the module name is usually 
// the assembly name plus an extension. 
ModuleBuilder mb = 
    ab.DefineDynamicModule(aName.Name, aName.Name + ".dll"); 

TypeBuilder tb = mb.DefineType(
    "MyDynamicType", 
    TypeAttributes.Public); 

注意使用ModuleBuilder類的,類型被添加到模塊。程序集可以包含多個模塊是非常不相關的,構建環境不支持它。不僅僅是IDE,MSBuild也不支持它。您必須自己編寫構建腳本才能使用al.exe, the assembly linker。沒有很好的理由這樣做,我可以想到,所有.NET編譯器已經知道如何直接生成單個模塊組件。 Al.exe是一個典型的引導工具,可能用於構建mscorlib.dll。

+2

我一直在想關於循環依賴關係有一段時間了,但不敢問。我不知道**爲什麼** mscorlib和system有循環依賴關係,但是能否簡單地解釋一下如何維護兩個相互引用的項目(在相同的解決方案中)? – 2014-07-23 14:21:02

+0

@RaheelKhan對此的回答是「你不要」,將通用作品重構爲第三個程序集,這兩個程序集都可以參考。一個非常常見的現實世界的例子是插件體系結構,無論是你的程序集還是其他程序集都引用了定義所有接口的第三個API程序集。然後,您可以使用反射來創建插件的實例,並將其投射到您的程序和插件共享的通用界面上。 – 2015-01-10 22:59:08

11

模塊是程序集內代碼的邏輯集合。你可以在Assembly中有多個模塊,並且每個模塊都可以用不同的.NET語言編寫(就我所知,VS不支持創建多模塊程序集)。

組件包含模塊。模塊包含類。類包含函數。

來源:What is a module in .NET?

真正從:Bing搜索 「.NET組件裝配VS」

34

在.NET組件和模塊之間的區別在於,一個模塊 不包含清單

//Copied from CLR via C# 

什麼是體現?

清單是另一組 元數據表,它們基本上包含作爲程序集一部分的文件的名稱。他們也 描述大會的版本,文化,出版社,公開導出的類型,以及所有組成的文件。

CLR在組件上運行;即CLR始終首先加載包含清單 元數據表的文件,然後使用清單獲取程序集中其他文件/模塊的名稱。

如何將模塊組合成組件?

使用C#編譯器

要了解如何構建一個多文件/多模塊 裝配,讓我們假設我們有兩個源代碼文件:

■■RUT.cs,其中含有很少使用類型

■■FUT.cs,其中包含常用的類型

讓我們編譯很少使用類型int o他們自己的模塊,這樣如果組件的用戶從不訪問很少使用的類型,那麼組件的用戶將不需要0​​來部署該模塊。

csc /t:module RUT.cs 

此行使C#編譯器創建一個RUT.netmodule文件。該文件是一個標準的DLL PE文件, ,但本身CLR無法加載它。 接下來讓我們將常用的類型編譯到它們自己的模塊中。我們將使該模塊成爲程序集清單的守護者,因爲這些類型經常使用。實際上,因爲此模塊 現在將代表整個程序集,因此我將將輸出文件的名稱更改爲MultiFileLibrary.dll ,而不是將其稱爲FUT.dll。

csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs 

該行告訴C#編譯器編譯FUT.cs文件以生成MultiFileLibrary.dll文件。因爲指定了 /t:library,所以包含清單元數據表的DLL PE文件被髮送到MultiFileLibrary.dll文件中。 /addmodule:RUT .netmodule開關告訴編譯器RUT.netmodule 是應該被視爲程序集的一部分的文件。具體而言,/addmodule開關告知 編譯器將文件添加到FileDef清單元數據表,並將RUT.netmodule的公開 導出的類型添加到ExportedTypesDef清單元數據表。

編譯器完成其所有處理後,將創建圖2-1中顯示的兩個文件。 右側的模塊包含清單。

enter image description here

使用集鏈接

的效用Al.exe工具可以產生EXE或只包含描述的其他模塊的 類型的清單一個DLL PE文件。爲了理解AL.exe的工作原理,讓我們改變MultiFileLibrary.dll 程序集的構建方式。

csc /t:module RUT.cs 
csc /t:module FUT.cs 
al /out: MultiFileLibrary.dll /t:library FUT.netmodule RUT.netmodule 

圖2-3顯示了執行這些語句後產生的文件。

enter image description here

我建議你讀第2章:建築,包裝,部署和管理由傑弗裏裏希特應用程序和類型從通過C#CLR來詳細瞭解這個概念。

+1

downvoters應該寫下他們的理由。 – 2016-12-27 07:33:18

+1

這應該是公認的答案。 – fernacolo 2017-09-06 22:33:15