我正在尝试将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的父级不存在。
有出路吗?
答案 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上工作:)