2010-09-26 22 views

Respuesta

3

Difícil hablar de esto en términos familiares, esta capacidad no está expuesta en absoluto en los lenguajes C# o VB.NET. Sin embargo, el compilador C++/CLI lo usa. La forma en que se muestra en desensambladores como Ildasm.exe o Reflector tampoco está estandarizada.

Quizás el mejor ángulo es Reflector, eche un vistazo al ensamblado System.Data.dll. Está en un espacio de nombre sin nombre ("-" en Reflector), nodo <Module>. El .cctor que ves allí es un iniciailizador de módulo. El mismo tipo de animal que un constructor de clases estático pero a nivel de módulo. Se ejecuta cuando el ensamblaje se carga. C++/CLI lo usa para inicializar la biblioteca C runtime.

El método ___ CxxCallUnwindDtor() encuentra que hay un ejemplo de un "método global". El lenguaje C++/CLI no ofrece ninguna forma de hacer que este tipo de funciones sean públicas, sino que siempre están integradas en los metadatos con acceso interno. Y, por lo tanto, no se puede invocar directamente desde un programa C# o VB.NET. No he jugado lo suficiente con ModuleBuilder para saber si se puede alterar en absoluto más allá de lo que hace C++/CLI. Esto es todo muy oscuro y no tan útil.

+2

Mirando System.Data me ha iluminado. Hay algunos métodos que se definen como públicos, pero no hay forma de que pueda encontrarlos para acceder a ellos desde C#. – configurator

0

método Global significa que el método puede ser llamado sin calificar completamente de su nombre es decir

Método (Param) en lugar de Module.Method (Param).

En vb, un método público dentro de un módulo es global.

En C# un método público estático en una clase estática es global.

+1

Antes que nada, en C# (y creo que también en VB) no puede llamar a métodos públicos estáticos de otras clases sin calificarlos con el nombre de la clase. En segundo lugar y más importante, se llama a DefineGlobalMethod en el generador de módulos (no en un módulo VB que es una clase estática), no en un generador de clases, por lo que el método no estaría dentro de una clase. – configurator

+0

Definitivamente puede llamar a los métodos de módulo en VB sin calificar el nombre de clase. Pensé que este era el caso en C#, pero aparentemente una clase estática en C# se trata de manera diferente que un módulo en VB. – Tomasi

+0

Me encuentro corregido en el frente VB. ¿Estás seguro de que esto es lo que hace 'DefineGlobalMethod'? Dado que los métodos todavía pertenecen a un módulo VB, y 'DefineGlobalMethod' está directamente en la DLL. – configurator

Cuestiones relacionadas