Получение типов в mscorlib 2.0.5.0 (он же Silverlight mscorlib) через рефлексию?

Я пытаюсь добавить поддержку Silverlight в мой любимый язык программирования Nemerle.

Nemerle, в процессе компиляции, загружает все типы через отражение в основном в 2 шага

1-) Использование Assembly.LoadFrom для загрузки сборки. 2-) Использование Assembly.GetTypes() для получения типов.

Затем в конце компиляции он генерирует разрешенные типы с Reflection.Emit.

Эта процедура работает для всех сборок, включая Silverlight, кроме mscorlib из silverlight.

В C# это не удается:

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

но это проходит

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

Однако в последнем случае a.GetTypes() создает исключение, скажем, в System.Object родительский объект не существует.

Есть ли выход?

2 ответа

Решение

Предполагая, что вы пытаетесь отразить mscorlib в Silverlight из стандартного CLR, это не сработает, поскольку CLR не позволяет загружать несколько версий mscorlib. (Возможно, это связано с тем, что это может нарушить разрешение основных типов).

Обходной путь - использовать Mono.Cecil для проверки типов: http://mono-project.com/Cecil. Эта библиотека на самом деле работает лучше, чем Reflection в.NET и должна быть более мощной.

Вот некоторый код для начала работы:

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

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

Вы можете скомпилировать Nemerle с помощью сборки Silverlight, а затем Nemerle работает поверх Silverlight:)

Другие вопросы по тегам