Получение типов в mscorlib 2.0.5.0 (он же Silverlight mscorlib) через рефлексию? - PullRequest
7 голосов
/ 16 апреля 2009

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

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

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

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

Эта процедура работает для всех сборок, включая Silverlight, кроме mscorlib of 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 ]

5 голосов
/ 21 апреля 2009

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

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

Вот код, с которого можно начать:

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

var types =
    from ModuleDefinition m in asm.Modules
    from TypeDefinition t in m.Types
    select t.Name;
0 голосов
/ 08 марта 2011

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

...