2010-04-09 8 views
12

Pregunta rápida, ¿hay alguna manera de llamar a su método principal como lo desee? ¿O tiene que llamarse "Main()"?C# Forma de nombrar el método Main() por ti mismo?

+0

Esto nunca ha surgido de mí, solo porque puede tener solo una línea dentro de Main() y desde allí llamar lo que quiera. Sin embargo, estoy interesado en la respuesta. –

+0

¿Hay alguna otra razón que no sea la curiosidad? Alguien tiene una cita que dice así: "Si la depuración es dos veces más difícil que escribir un código nuevo, entonces, por definición, no es lo suficientemente inteligente para depurar el código 'más inteligente' que se le ocurra". Enredarse con las convenciones cae directamente en esa categoría. –

Respuesta

18

Tenga en cuenta que esta es una convención de C#, no una convención de .NET Runtime. Usted puede nombrar a su método de lo que usted desea en IL:

.module Mane.exe 
.subsystem 3 
.corflags 9 

.assembly extern mscorlib 
{ 
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89) 
    .ver 2:0:0:0 
} 

.assembly Mane 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = (01 00 00 00 00) 
    .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = (01 00 01 00 00) 
    .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = (01 00 07 31 2E 30 2E 30 2E 30 00 00) 
    .custom instance void [mscorlib]System.Resources.NeutralResourcesLanguageAttribute::.ctor(string) = (01 00 05 65 6E 2D 55 53 00 00) 

    .permissionset reqmin 
       = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'Execution' = bool(true)}} 
    .hash algorithm 0x00008004 
    .ver 1:0:0:0 
} 

.namespace Mane 
{ 
    .class private abstract auto ansi sealed beforefieldinit Program extends [mscorlib]System.Object 
    { 
     .method private hidebysig static void Mane() cil managed 
     { 
      .entrypoint 
      .maxstack 1 
      ldstr "Hello, World!" 
      call void [mscorlib]System.Console::WriteLine(class System.String) 
      ret 
     } 
    } 
} 
+0

Gracias, gran respuesta. Muy interesante – Chilln

+1

De nada, gracias por las felicitaciones. Como una idea de último momento, me pregunto si una herramienta como PostSharp podría inyectar la parte apropiada del IL (.entrypoint) en un método que fue decorado con un atributo particular y por lo tanto obviar la "limitación" C# del punto de entrada que necesita ser nombrado Principal(). –

1

Tiene que llamarse Principal().

1

Necesita ser llamado Main() ya que es el punto de entrada para la aplicación.

El nombre y las restricciones están definidos por el Framework. Esta es la página de MSDN para referencia:

Main (C#)

+0

Aparentemente, esta es una convención de C#, no una convención de .NET Framework. –

+0

@Justin: ¿Sabía que suministró un enlace .NET 1.1? Lo he arreglado para que no tenga el número de versión. –

1

Tiene que ser llamado Principal.

Si realmente lo deseaba, podría crear su propio método y simplemente llamarlo como la única línea de código en Main.

public static void Main(String[] args) 
{ 
    Mane(args); 
} 
+0

¿Alguna razón para hacer público principal? MSDN dice que no debería ser público ... – IVlad

1

No ... Principal es estándar. Sin embargo, lo que puede hacer es cambiar la clase que aloja el método Principal desde la configuración de "Objeto de inicio" de la propiedad del proyecto

Pero, en realidad, ¿por qué desea hacerlo? todo el mundo sabe que es principal ... así que estaría confundiendo a otros desarrolladores que pueden parecer a su código

1

De "Main() and Other Methods (C# vs Java)":

aplicación # Cada C debe contener un único método principal que especifica que la ejecución del programa es comenzar

+0

@brydgesk: intente proporcionar enlaces de MSDN sin el número de versión en ellos. Ellos siempre estarán al día. –

5

Puede llamar a su método principal de otra manera, pero no se llamará como el primer método en su aplicación a menos que se llame Main. Hay algunos otros requisitos y cosas para tener en cuenta también. De MSDN:

  • El método Principal es el punto de entrada de su programa, donde el control del programa comienza y termina.
  • Se declara dentro de una clase o estructura. Debe ser estático y no debe ser público.
  • Puede tener un tipo void o int return.
  • El método Principal se puede declarar con o sin parámetros.
  • Los parámetros se pueden leer como argumentos de línea de comandos de índice cero.
  • A diferencia de C y C++, el nombre del programa no se trata como el primer argumento de línea de comando.
+0

@Mark: es mejor proporcionar enlaces de MSDN sin el número de versión, ya que siempre se referirán a la versión actual. –

3

No creo que hay una manera de hacerlo en el lado C# de cosas, pero si usted está dispuesto a modificar su IL es fácil suficiente para entrar y agregar .entrypoint a la función en IL. Consulte la entrada CLI en wikipedia.

Cuestiones relacionadas