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

发布于 2024-08-29 13:12:14 字数 489 浏览 10 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花心好男孩 2024-09-05 13:12:14

您是否看过 Module.GetMethods

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

您可以使用 < 获取程序集的所有模块代码>Assembly.GetModules()

Have you looked at Module.GetMethods?

Returns the global methods defined on the module

You can get all the modules of your assembly using Assembly.GetModules().

固执像三岁 2024-09-05 13:12:14

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

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

正如 Jon 所说,您可以使用 Module.GetMethodModule.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 and Module.GetField to operator on the members of the type.

If you want more control, you can just use Mono.Cecil.

一身软味 2024-09-05 13:12:14

请注意,不带参数的 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)));
}

Note, that Module.GetMethod() without parameters won't return all module's methods.
Use GetMethods(BindingFlags) instead.

C++/CLI example:

#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)));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文