7

お気に入りのプログラミング言語 Nemerle に Silverlight サポートを追加しようとしています。

Nemerle は、コンパイル手順で、主に 2 つのステップでリフレクションを介してすべての型をロードします。

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"); 

後者では、 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 に答える