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

时间:2009-04-16 06:35:23

标签: 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");

但是这传递了:

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

后者中的Bu,a.GetTypes()抛出异常,说System.Object的父级不存在。

有出路吗?

2 个答案:

答案 0 :(得分:5)

假设您试图从标准CLR反映Silverlight的mscorlib,这将无效,因为CLR不允许加载多个版本的mscorlib。 (也许这是因为它可能会破坏其核心类型的解析)。

解决方法是使用Mono.Cecil检查类型: http://mono-project.com/Cecil。这个库实际上比.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;

答案 1 :(得分:0)

您可以使用Silverlight程序集编译Nemerle,然后让Nemerle在Silverlight上工作:)