7

我正在嘗試將Silverlight支持添加到我最喜歡的編程語言Nemerle中。通過反射在mscorlib 2.0.5.0(又名Silverlight mscorlib)中獲取類型?

Nemerle,上編寫的程序,加載經由反射所有類型主要是在2個步驟

1-)使用Assembly.LoadFrom加載組件 2-)Usese 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的父不存在。

有沒有出路?

+0

你是從Silverlight的本身或這樣做標準CLR? – 2009-04-21 09:43:39

回答

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; 
1

您可以編譯Nemerle的Silverlight程序集,然後你Nemerle之上工作的Silverlight :)

相關問題