2011-08-09 25 views
5

Tengo el siguiente código donde estoy imprimiendo valores antes de que se llame al método Main() utilizando un constructor estático. ¿Cómo puedo imprimir otro valor después de que Main() haya regresado, sin modificar el método Main()?¿Cómo imprimo cualquier valor después de llamar al método Main()?

quiero una salida como:

1st 
2nd 
3rd 

El código "base" que utilizo:

class Myclass 
{   
    static void Main(string[] args) 
    { 
     Console.WriteLine("2nd"); 
    }    
} 

he añadido un constructor estático a myClass para la visualización de "primera"

class Myclass 
{  
static Myclass() { Console.WriteLine("1st"); } //it will print 1st 
    static void Main(string[] args) 
    { 
     Console.WriteLine("2nd"); // it will print 2nd 
    }    
} 

Ahora lo que tengo que hacer es imprimir 3rd sin modificar el Main() método. ¿Cómo hago eso, si es posible?

Respuesta

6

Continuando en su mismo pensamiento con el constructor estático, puede utilizar la AppDomain.ProcessExit Evento dejando Main() intacto.

class Myclass 
    { 
     // will print 1st also sets up Event Handler 
     static Myclass() 
     { 
      Console.WriteLine("1st"); 
      AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); 
     } 

     static void Main(string[] args) 
     { 
      Console.WriteLine("2nd"); // it will print 2nd 
     } 

     static void CurrentDomain_ProcessExit(object sender, EventArgs e) 
     { 
      Console.WriteLine("3rd"); 
     } 
    } 
+0

superlike gracias :) – Neo

3

No se puede en C#. En otros lenguajes, como C++, es posible hacer esto en un destructor de un objeto estático o global, pero los finalizadores en C# no son deterministas. Es posible que ni siquiera se los llame si el objeto no es basura recolectada antes de que finalice el proceso.

+0

cómo ??? ¿Por qué no lo usamos en el C# usando destructor ????? – Neo

+0

¿Podemos hacerlo usando dos métodos Main() ???? – Neo

+0

Incluso entonces, el método principal es estático: no se llama a ningún destructor de objetos. Como tal, nada funciona aquí; la clase solo se descarga cuando se descarga el dominio de aplicación. – TomTom

3

Agregue otra clase con un Main estático adecuado como punto de entrada del programa. En esta llamada Myclass.Main:

class MyOtherClass { 
    static void Main(string[] args) { 
    Console.WriteLine("1st"); 
    Myclass.Main(args); 
    Console.WriteLine("3rd"); 
    } 
} 

y luego cambiar las opciones de compilación para seleccionar MyOtherClass como el punto de entrada del programa. En VS esto se hace en Propiedades del proyecto | Aplicación | Poner en marcha el objeto. Con la línea de comando, use la opción /main:typename para `csc.exe.

+0

+1 Probablemente el mejor resultado. También es técnicamente legal en los parámetros proporcionados: redirigir el método principal es un cambio en la configuración del proyecto (punto de entrada), no el método principal en sí mismo, por lo que se mantiene dentro de los parámetros solicitados. – TomTom

+0

Pero excepto esto, ¿lo hacemos al usar Anular ese método Main()? – Neo

+0

@Ashish: solo se pueden anular los métodos virtuales; 'Main' es estático, por lo que no puede ser virtual y, por lo tanto, no puede anularse. – Richard

5

Hay un par de eventos puede adjuntar a, para atrapar a los eventos de salida de la aplicación:

.NET Console Application Exit Event

Pero estoy preguntando lo que está tratando de lograr aquí? ¿Estás seguro de que no puedes cambiar tu método Principal? Si no, ¿por qué?

¿No puedes separar el cuerpo del método de Main en otro método, y hacer que su aspecto principal de esta manera:

class Myclass 
{  
static Myclass() 
    static void Main(string[] args) 
    { 
     Console.WriteLine("1st"); 
     Process(args); 
     Console.WriteLine("3rd"); 
    } 

    static void Process(string[] args) { 
     Console.WriteLine("2nd"); // it will print 2nd 
    } 
} 
Cuestiones relacionadas