我有以下代码,在使用静态构造函数调用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.