5

System.Reflection 不(AFAIK)支持在程序集中反映全局方法。在汇编级别,我必须从根类型开始。

我的编译器可以生成带有全局方法的程序集,而我的标准引导库是一个包含一些全局方法的 dll。我的编译器使用 System.Reflection 在编译时导入程序集元数据。看来如果我依赖 System.Reflection,全局方法是不可能的。最干净的解决方案是将我所有的标准方法转换为类静态方法,但关键是,我的语言允许全局方法,并且 CLR 支持它,但是 System.Reflection 留下了一个空白。

ildasm 很好地显示了全局方法,但我认为它不使用 System.Reflection 本身,而是直接访问元数据和字节码。

除了 System.Reflection,是否有人知道我可以使用的任何其他第 3 方反射或反汇编库(假设我最终将我的编译器作为免费的、BSD 许可的开源版本发布)。

已解决:没有差距,除了我的知识。感谢您指出 GetModules,伙计们!

4

3 回答 3

9

你看过Module.GetMethods吗?

返回模块上定义的全局方法

您可以使用Assembly.GetModules().

于 2010-04-22T21:39:17.093 回答
4

您一直在 CLR 和 System.Reflection 之间存在差距,但实际上,没有全局方法或全局字段之类的东西。

它们只是以特定类型(named)定义的传统静态方法和静态字段<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 回答