Получение типов в 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:)