7

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

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

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

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

此过程适用于所有程序集,包括 Silverlight 程序集,除了 silverlight 的 mscorlib。

在 c# 中,这失败了:

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

但这通过了:

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

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

有出路吗 ?

4

2 回答 2

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;
于 2009-04-21T13:44:18.667 回答
0

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

于 2011-03-08T09:23:39.997 回答