System.Reflection - 全局方法不可用于反射
System.Reflection 不(据我所知)支持反映程序集中的全局方法。在程序集级别,我必须从根类型开始。
我的编译器可以生成具有全局方法的程序集,而我的标准引导库是一个包含一些全局方法的 dll。我的编译器使用 System.Reflection 在编译时导入程序集元数据。看来如果我依赖 System.Reflection,全局方法就不可能了。最干净的解决方案是将我的所有标准方法转换为类静态方法,但重点是,我的语言允许全局方法,并且 CLR 支持它,但 System.Reflection 留下了一个空白。
ildasm 很好地显示了全局方法,但我认为它不使用 System.Reflection 本身,而是直接访问元数据和字节码。
除了 System.Reflection 之外,是否有人知道我可以使用的任何其他第 3 方反射或反汇编库(假设我最终将我的编译器作为免费的、BSD 许可的开源发布)。
已解决:除了我所知之外,不存在任何差距。谢谢你们指出 GetModules,伙计们!
System.Reflection does not (AFAIK) support reflecting on global methods in an assembly. At the assembly level, I must start with the root types.
My compiler can produce assemblies with global methods, and my standard bootstrap lib is a dll that includes some global methods. My compiler uses System.Reflection to import assembly metadata at compile time. It seems if I depend on System.Reflection, global methods are not a possibility. The cleanest solution is to convert all of my standard methods to class static methods, but the point is, my language allows global methods, and the CLR supports it, but System.Reflection leaves a gap.
ildasm shows the global methods just fine, but I assume it does not use System.Reflection itself and goes right to the metadata and bytecode.
Besides System.Reflection, is anyone aware of any other 3rd party reflection or disassembly libs that I could make use of (assuming I will eventually release my compiler as free, BSD licensed open source).
SOLVED: There is no gap, except in my knowledge. Thanks for pointing out GetModules, guys!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您是否看过
Module.GetMethods
?您可以使用 < 获取程序集的所有模块代码>Assembly.GetModules()。
Have you looked at
Module.GetMethods
?You can get all the modules of your assembly using
Assembly.GetModules()
.您一直在努力解决 CLR 和 System.Reflection 之间的差距,但实际上,不存在全局方法或全局字段之类的东西。
它们只是以特定类型定义的传统静态方法和静态字段,名为
,必须存在于每个有效的程序集中。正如 Jon 所说,您可以使用
Module.GetMethod
和Module.GetField
对类型的成员进行操作。如果您想要更多控制,可以使用 Mono.Cecil。
You keep beating on a gap between the CLR and System.Reflection, but actually, there's no such thing as a global method or a global field.
They are just traditional static methods and static fields that are defined in particular type, named
<Module>
, which has to be present in every valid assembly.As Jon said, you can use
Module.GetMethod
andModule.GetField
to operator on the members of the type.If you want more control, you can just use Mono.Cecil.
请注意,不带参数的
Module.GetMethod()
不会返回所有模块的方法。请改用 GetMethods(BindingFlags)。
C++/CLI 示例:
Note, that
Module.GetMethod()
without parameters won't return all module's methods.Use GetMethods(BindingFlags) instead.
C++/CLI example: