2016-02-25 33 views
5

Sto utilizzando Mono.Cecil per leggere un assembly generato da Regex.CompileToAssembly(). Quando eseguo l'iterazione dei tipi, esiste un tipo nello spazio dei nomi radice denominato <Module>. Il tipo non ha un tipo di base. Cos'è questo tipo? Si tratta di un artefatto Mono.Cecil o qualcosa che in realtà è una parte reale degli assembly .NET? Che ruolo gioca?Che cos'è il tipo "<Module>"?

risposta

7

Il tipo <Module> è un segnaposto per dichiarazioni che non si adattano al modello CLI. Normalmente rilevante solo negli assembly che sono in modalità mista, contenente sia il codice scritto in un linguaggio gestito sia uno non gestito come C o C++. È vuoto per gli assembly gestiti puramente.

Queste lingue supportano funzioni libere e variabili globali. Il CLR non supporta direttamente questo, i metodi e le variabili devono sempre essere un membro di un tipo. Quindi il generatore di metadati usa un semplice trucco, crea un tipo falso per essere la casa di tali funzioni e variabili. Il nome di quel tipo falso è <Module>. Ha sempre interna accessibilità per nascondere i membri. Esiste sempre uno di questi tipi, il suo RID è sempre 1.

Il codice sorgente CLR lo chiama "Classe globale".