如何在Main()方法被调用后打印任何值?



我有以下代码,在使用静态构造函数调用Main()方法之前打印值。我如何在Main()返回后打印另一个值,而不修改Main()方法?

我想输出如下:

1st 
2nd 
3rd

我使用的"基础"代码:

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

我给Myclass添加了一个静态构造函数来显示"1st"

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

现在我需要做的是打印第3 ,而不修改Main()方法。如果可能的话,我该怎么做呢?

与静态构造函数相同,您可以使用AppDomain。ProcessExit事件未触及Main()。

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");
        }
    }

您可以附加几个事件来捕获应用程序的退出事件:

。. NET控制台应用程序退出事件

但我想知道你在这里想达到什么目的?您确定不能更改Main方法吗?如果不是,为什么?

你能不能把Main的方法体分离成另一个方法,并使你的Main看起来像这样:

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
    }
}

在c#中不能。在其他语言(如c++)中,可以在静态或全局对象的析构函数中做到这一点,但c#中的终结器是不确定的。如果对象在进程结束前没有被垃圾收集,它们甚至可能根本不会被调用。

添加另一个具有适合作为程序入口点的静态Main的类。在此呼叫Myclass.Main:

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

,然后更改构建选项,选择MyOtherClass作为程序入口点。在VS中这是在项目属性|应用程序|启动对象中完成的。在命令行中使用/main:typename选项' csc.exe.

最新更新