什么是全局方法?

8

什么是 .net 中的全局方法?我指的是由 ModuleBuilder.DefineGlobalMethod 方法创建的方法。

这些方法能够从 C# 或其他 .net 语言中调用吗?

2个回答

5

很难用通俗易懂的语言来谈论这个能力,因为C#或VB.NET语言根本没有暴露这个能力。但是C++/CLI编译器使用了它。像Ildasm.exe或Reflector这样的反汇编器显示方式也不是标准化的。

也许最好的方法是使用Reflector,查看System.Data.dll程序集。它位于未命名命名空间(Reflector中的“-”),<Module>节点中。你在那里看到的.cctor是一个模块初始化器。与静态类构造函数相同,但在模块级别上。它在程序集加载时运行。C++/CLI使用它来初始化C运行时库。

你在那里找到的___CxxCallUnwindDtor()方法是全局方法的一个示例。C++/CLI语言没有提供任何方法使这些类型的函数公共,它们始终以内部可访问性嵌入元数据。因此无法直接从C#或VB.NET程序调用它们。我还没有玩过ModuleBuilder,不知道是否可以混淆它,超出C++/CLI的范围。这都非常晦涩,实际上并不太有用。


2
看了一下 System.Data,我受益匪浅。那里有一些被定义为公共的方法,但我找不到从 C# 访问它们的方法。 - configurator

0

全局方法指的是可以直接调用方法而不需要完全限定其名称,例如

Method(Param) 而不是 Module.Method(Param)。

在 VB 中,模块内的公共方法是全局的。

在 C# 中,静态类中的公共静态方法是全局的。


1
首先,在C#中(我认为VB也是如此),您无法在不使用类名限定的情况下从其他类调用公共静态方法。其次,更重要的是,DefineGlobalMethod是在模块生成器上调用的(而不是VB模块,它是一个静态类),而不是在类生成器上调用 - 因此该方法不会在类内部。 - configurator
你肯定可以在VB中调用模块方法而不需要限定类名。我曾认为在C#中也是如此,但显然,在C#中静态类与VB中的模块有所不同。 - Tomasi
我在 VB 方面的观点上被纠正了。但你确定 DefineGlobalMethod 就是这么做的吗?因为这些方法仍然属于 VB 模块,并且 DefineGlobalMethod 直接在 DLL 上。 - configurator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接