通过反射获取mscorlib 2.0.5.0(又名Silverlight mscorlib)中的类型?

use*_*754 7 silverlight reflection.emit nemerle mscorlib assembly.reflectiononly

我正在尝试将Silverlight支持添加到我最喜欢的编程语言Nemerle中.

Nemerle,在编译过程中,主要通过两个步骤通过反射加载所有类型

1-)使用Assembly.LoadFrom加载程序集2-)使用Assembly.GetTypes()来获取类型

然后在编译结束时,它使用Reflection.Emit发出已解析的类型.

此过程适用于所有程序集,包括除Silverlight的mscorlib之外的Silverlight程序集.

在c#中,这失败了:

 var a = System.Reflection.Assembly.LoadFrom(@"c:\mscorlib.dll");
Run Code Online (Sandbox Code Playgroud)

但这传递了:

var a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"c:\mscorlib.dll"); 
Run Code Online (Sandbox Code Playgroud)

Bu在后者中,a.GetTypes()抛出一个异常,说System.Object的父节点不存在.

有出路吗 ?

Joe*_*ari 5

假设您试图从标准CLR反映Silverlight的mscorlib,这将无法工作,因为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;
Run Code Online (Sandbox Code Playgroud)