5

System.Reflectionは、アセンブリ内のグローバルメソッドへの反映をサポートしていません(AFAIK)。アセンブリレベルでは、ルートタイプから始める必要があります。

私のコンパイラはグローバルメソッドを使用してアセンブリを生成できます。標準のブートストラップライブラリは、いくつかのグローバルメソッドを含むdllです。私のコンパイラはSystem.Reflectionを使用して、コンパイル時にアセンブリメタデータをインポートします。System.Reflectionに依存している場合、グローバルメソッドは可能ではないようです。最もクリーンな解決策は、すべての標準メソッドをクラス静的メソッドに変換することですが、要点は、私の言語はグローバルメソッドを許可し、CLRはそれをサポートしますが、System.Reflectionはギャップを残します。

ildasmはグローバルメソッドを問題なく表示しますが、System.Reflection自体を使用せず、メタデータとバイトコードに直接アクセスすると思います。

System.Reflectionの他に、私が利用できる他のサードパーティのリフレクションまたは逆アセンブルライブラリを知っている人はいますか(最終的にコンパイラを無料のBSDライセンスのオープンソースとしてリリースすると仮定します)。

解決済み:私の知識を除いて、ギャップはありません。GetModulesを指摘してくれてありがとう、みんな!

4

3 に答える 3

9

見たことがありModule.GetMethodsますか?

モジュールで定義されたグローバルメソッドを返します

を使用して、アセンブリのすべてのモジュールを取得できますAssembly.GetModules()

于 2010-04-22T21:39:17.093 に答える
4

あなたはCLRとSystem.Reflectionの間のギャップを打ち負かし続けていますが、実際には、グローバルメソッドやグローバルフィールドのようなものはありません。

<Module>これらは、すべての有効なアセンブリに存在する必要がある、という名前の特定のタイプで定義されている従来の静的メソッドと静的フィールドにすぎません。

ジョンが言ったように、あなたはタイプのメンバーを操作するためModule.GetMethodにそしてを使うことができます。Module.GetField

より詳細な制御が必要な場合は、Mono.Cecilを使用できます。

于 2010-04-22T21:45:06.070 に答える
2

Module.GetMethod()パラメータがないと、すべてのモジュールのメソッドが返されるわけではないことに注意してください。
代わりにGetMethods(BindingFlags)を使用してください。

C ++ / CLIの例:

#using <System.dll>
using namespace System;
using namespace System::Reflection;
using namespace System::Diagnostics;

bool has_main(array<MethodInfo^>^ methods)
{
    for each(auto m in methods)
        if(m->Name == "main")
            return true;
    return false;
}

int main()
{
    auto module = Assembly::GetExecutingAssembly()->GetModules(false)[0];
    Debug::Assert(has_main(module->GetMethods()) == false);
    Debug::Assert(has_main(module->GetMethods(BindingFlags::Static | BindingFlags::NonPublic)));
}
于 2011-03-08T19:39:04.093 に答える