line no 1 line no 2 line no 3
没有改变读取的主要方法
static void Main(string[] args) { Console.WriteLine("line no 2"); }
现在一种方法是为控制台应用程序提供多个入口点.但是我尝试了另一种方法,如下:
class Program { [Some] static void Main(string[] args) { Console.WriteLine("line no 2"); } } class SomeAttribute : Attribute { public SomeAttribute() { Console.WriteLine("line no 1"); } ~SomeAttribute() { Console.WriteLine("line no 3"); } }
当我在每一个WriteLine上应用一个断点时,我可以看到这个方法有效,但是在控制台上也没有反映出来.
只是好奇.
解决方法
>第一个钩子是一个程序静态构造函数,它是在程序类中的Main方法之前执行的guarantee.
>第二个是AppDomain的事件ProcessExit,“当默认应用程序域的父进程退出时发生”.您可以使用静态构造函数订阅此事件.
class Program { static Program() { Console.WriteLine("line no 1"); AppDomain.CurrentDomain.ProcessExit += (s,a) => Console.WriteLine("line no 3"); } static void Main(string[] args) { Console.WriteLine("line no 2"); } }
打印:
line no 1 line no 2 line no 3
下一部分将是相当长的一个.我会尝试解释你的问题中SomeAttribute的问题.
首先,考虑这个StackOverflow问题才能正确地知道when custom attributes constructors are executed.这不是那么简单,因为它可能看起来乍一看.
正如我们已经知道的那样,定制属性的ctor只会被执行,当你将通过反射访问它.所以在你的例子中,简单的程序执行将不会触发属性构造函数.但是,当您将SomeAttribute应用于Main方法时,为什么会断点?事实证明,视觉工作室使用反射来找出主要方法,并将调试器附加到您的应用程序.但是在这一点上没有控制台窗口.所以声明Console.WriteLine是无用的并产生影响.此外,它似乎阻止了控制台输出的所有下一个语句.
所以下一个代码将产生不同的结果,这取决于你是否使用VS调试器运行它:
class Program { [MyAttribute] static void Main() { } } class MyAttribute : Attribute { public MyAttribute() { MessageBox.Show("MyAttribute ctor"); } }
如果您运行它没有调试器(Ctrl F5在VS默认配置),你会看到,程序终止,没有窗口出现.当您使用调试器(F5)执行它时,您将看到
而VS旁边没有控制台窗口,只有win窗体图标:
如前所述,当您没有人尝试写入控制台时,所有其他对Console.WriteLine的调用不会影响您的控制台应用程序.这就是为什么您可以看到任何控制台消息,即使您在构造函数中执行断点.