System.Reflection - 全局方法不可用于反射

时间:2010-04-22 21:36:27

标签: .net reflection clr ildasm

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

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

ildasm显示全局方法很好,但我认为它不使用System.Reflection本身并直接进入元数据和字节码。

除了System.Reflection之外,是否有人知道我可以使用的任何其他第三方反射或反汇编库(假设我最终将我的编译器释放为免费的,BSD许可的开源)。

解答:除了我所知,没有差距。谢谢你指出GetModules,伙计们!

3 个答案:

答案 0 :(得分:9)

你看过Module.GetMethods吗?

  

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

您可以使用Assembly.GetModules()获取装配的所有模块。

答案 1 :(得分:4)

你继续在CLR和System.Reflection之间徘徊,但实际上,没有全局方法或全局字段这样的东西。

它们只是传统的静态方法和静态字段,它们以特定类型定义,名为<Module>,必须存在于每个有效的程序集中。

正如Jon所说,你可以使用Module.GetMethodModule.GetField来操作该类型的成员。

如果您想要更多控制权,可以使用Mono.Cecil

答案 2 :(得分: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)));
}