System.Reflection不支持(AFAIK)支持反映程序集中的全局方法。在汇编级别,我必须从根类型开始。
我的编译器可以使用全局方法生成程序集,而我的标准引导程序库是一个包含一些全局方法的DLL。我的编译器使用System.Reflection在编译时导入程序集元数据。似乎我依赖System.Reflection,全局方法不可能。最干净的解决方案是将我的所有标准方法转换为类静态方法,但重点是,我的语言允许全局方法,而CLR支持它,但System.Reflection留下了空白。
ildasm显示全局方法很好,但我认为它不使用System.Reflection本身并直接进入元数据和字节码。
除了System.Reflection之外,是否有人知道我可以使用的任何其他第三方反射或反汇编库(假设我最终将我的编译器释放为免费的,BSD许可的开源)。
解答:除了我所知,没有差距。谢谢你指出GetModules,伙计们!
答案 0 :(得分:9)
答案 1 :(得分:4)
你继续在CLR和System.Reflection之间徘徊,但实际上,没有全局方法或全局字段这样的东西。
它们只是传统的静态方法和静态字段,它们以特定类型定义,名为<Module>
,必须存在于每个有效的程序集中。
正如Jon所说,你可以使用Module.GetMethod
和Module.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)));
}