2012-02-14 18 views
40

Ho cercato di comprendere la risposta "giusta" a questo? ci sono un paio di argomenti su StackOverflow che copre questo, ma questo è in qualche modo in conflitto con la documentazione di msdn..NET Module vs Assembly

per esempio, notare il diagramma nel 2 ° risposta alla sua domanda: What is a Managed Module (compared to an Assembly)?

Ora guardate il diagramma MSDN: http://msdn.microsoft.com/en-us/library/zst29sk2(VS.100).aspx

diagramma msdn implica che un gruppo di file singolo non comprende di un modulo, ma piuttosto di un manifest, il codice, digita i metadati, ecc. Questo è diverso da molti altri articoli che ho letto in cui si afferma che un singolo gruppo di file ha un modulo.

Qual è la risposta? Se la risposta è "entrambi", il modulo è un file phyical separato collegato tramite il manifest assembly?

+0

possibile duplicato di [Che cos'è un modulo in .NET?] (Http://stackoverflow.com/questions/645728/what-is-a-module-in-net) –

risposta

31

Ogni assemblea ha almeno un modulo. È un dettaglio di implementazione altamente invisibile. Ma puoi vederlo quando usi Reflection.Emit. Dal codice di esempio per la 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); 

Nota l'utilizzo della classe ModuleBuilder, tipi vengono aggiunti ad un modulo. Che un assembly possa contenere più moduli è piuttosto irrilevante, l'ambiente di sviluppo non lo supporta. Non solo l'IDE, MSBuild non supporta neanche. Dovresti scrivere uno script di compilazione per utilizzare al.exe, the assembly linker. Non ci sono buoni motivi per fare ciò che posso pensare, tutti i compilatori .NET sanno già come generare direttamente un singolo modulo. Al.exe è un tipico strumento di bootstrap, probabilmente usato per creare mscorlib.dll.

+2

Mi sono chiesto le dipendenze circolari per un po 'di tempo ma aveva paura di chiedere. Non so ** perché ** mscorlib e il sistema hanno dipendenze circolari ma potresti spiegare brevemente in che modo avrei potuto mantenere due progetti (nella stessa soluzione o no) che si richiamano l'un l'altro? –

+0

@RaheelKhan la risposta è "Non si", refactoring i pezzi comuni in un terzo assembly che entrambi gli assembly possono fare riferimento. Un esempio molto comune di questo mondo reale è un'architettura di plugin, sia l'assembly che l'altro assembly fanno riferimento a un terzo assembly API che definisce tutte le interfacce. È quindi possibile utilizzare reflection per creare istanze del plug-in e trasmetterlo all'interfaccia comune sia per il programma che per la condivisione del plug-in. –

11

Un modulo è una raccolta logica di codice all'interno di un assieme. È possibile avere più moduli all'interno di un assieme e ogni modulo può essere scritto in diversi linguaggi .NET (VS, per quanto ne so, non supporta la creazione di assiemi multi-modulo).

Gli assembly contengono moduli. I moduli contengono classi. Le classi contengono funzioni.

Da: What is a module in .NET?

Davvero Da: Bing search "modulo .NET vs montaggio"

34

NET la differenza tra un assieme e modulo è che un modulo non contiene il manifesta.

//Copied from CLR via C# 

ciò che è palese?

Il file manifest è un'altra serie di tabelle di metadati che contengono essenzialmente i nomi dei file che fanno parte dell'assieme. Inoltre, descrivono la versione dell'assembly, la lingua, l'editore, i tipi esportati pubblicamente e tutti i file compresi nell'assieme da .

Il CLR funziona su assiemi; vale a dire, il CLR carica sempre il file che contiene le tabelle dei metadati manifest e quindi utilizza il manifest per ottenere i nomi degli altri file/moduli presenti nell'assembly.

Come combinare i moduli per formare un assieme?

con C# compilatore

per capire come costruire un fascicolo/multimodulo assemblaggio, supponiamo di avere due file di codice sorgente:

■■ RUT.cs, che contiene raramente utilizzato tipi

■■ FUT.cs, che contiene i tipi di uso frequente

Diamo compilare i tipi usati raramente int o il proprio modulo in modo che gli utenti dell'assembly non abbiano bisogno di per distribuire questo modulo se non accedono mai ai tipi usati raramente.

csc /t:module RUT.cs 

Questa linea fa sì che il compilatore C# per creare un file RUT.netmodule. Questo file è un file PE DLL standard, ma, di per sé, il CLR non può caricarlo. Quindi compiliamo i tipi usati di frequente nel loro modulo. Creeremo questo modulo il custode del manifest dell'assembly perché i tipi sono usati così spesso. Infatti, poiché questo modulo rappresenterà l'intero assembly, cambierò il nome del file di output in MultiFileLibrary.dll anziché chiamarlo FUT.dll.

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

Questa linea dice al compilatore C# per compilare il file FUT.cs per produrre il file MultiFileLibrary.dll. Perché /t: la libreria è specificata, un file PE DLL contenente le tabelle dei metadati manifest viene emesso nel file MultiFileLibrary.dll. L'interruttore .netmodule /addmodule:RUT dice al compilatore che Rut.netmodule è un file che dovrebbe essere considerato parte dell'assieme. Nello specifico, l'interruttore /addmodule comunica al compilatore di aggiungere il file alla tabella dei metadati manifest di FileDef e di aggiungere i tipi esportati di RUT.netmodule a nella tabella dei metadati manifest di ExportedTypesDef.

Dopo che il compilatore ha completato tutta la sua elaborazione, vengono creati i due file mostrati nella Figura 2-1. Il modulo a destra contiene il manifest.

enter image description here

Utilizzando l'Assembly Linker

L'utilità Al.exe in grado di produrre un file PE DLL che contiene solo un manifesto che descrive i tipi in altri moduli EXE o. Per capire come funziona AL.exe, cambiamo il modo in cui l'assembly MultiFileLibrary.dll viene creato.

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

La Figura 2-3 mostra i file risultanti dall'esecuzione di queste istruzioni.

enter image description here

vorrei suggerire di leggere CAPITOLO 2: costruzione, imballaggio, la distribuzione e applicazioni Amministrazione e tipi da CLR via C# di Jeffrey Richter per capire il concetto in dettaglio.

+1

downvoters dovrebbero scrivere le loro ragioni. –

+1

Questa dovrebbe essere la risposta accettata. – fernacolo