7

Sto cercando di aggiungere il supporto Silverlight al mio linguaggio di programmazione preferito Nemerle.Ottenere i tipi in mscorlib 2.0.5.0 (noto anche come Silverlight mscorlib) tramite la riflessione su?

Nemerle, sulla procedura di compilazione, carica tutti i tipi tramite riflesso principalmente in 2 fasi

1-) utilizza Assembly.LoadFrom per caricare assembly 2-) Assembly.GetTypes Usese() per ottenere i tipi

Quindi alla fine della compilazione emette i tipi risolti con Reflection.Emit.

Questa procedura è valida per tutti gli assiemi inclusi quelli Silverlight tranne mscorlib di silverlight.

in C# questo non riesce:

var a = System.Reflection.Assembly.LoadFrom(@"c:\mscorlib.dll"); 

ma questo passa:

var a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"c:\mscorlib.dll"); 

Bu in quest'ultimo, a.GetTypes() genera un'eccezione genitore sayin System.Object non esiste.

C'è una via d'uscita?

+0

stai facendo questo da Silverlight stesso o la CLR standard? –

risposta

5

Supponendo che si stia cercando di riflettere su mscorlib di Silverlight dal CLR standard, ciò non funzionerà perché il CLR non consente il caricamento di più versioni di mscorlib. (Forse perché potrebbe sconvolgere la risoluzione dei suoi tipi principali).

Una soluzione consiste nell'utilizzare Mono.Cecil per ispezionare i tipi: http://mono-project.com/Cecil. Questa libreria ha prestazioni migliori di .NET Reflection e dovrebbe essere più potente.

Ecco po 'di codice per iniziare:

AssemblyDefinition asm = AssemblyFactory.GetAssembly(@"C:\mscorlib.dll"); 

var types = 
    from ModuleDefinition m in asm.Modules 
    from TypeDefinition t in m.Types 
    select t.Name; 
1

È possibile compilare Nemerle con Silverlight montaggio e allora avete Nemerle lavorando sulla parte superiore del Silverlight :)