当我通过自定义 Attribute 装饰我的Main方法时遇到了一件奇怪的事情:
class Program
{
[Attr]
static void Main(string[] args)
{
Console.WriteLine("Main end..");
Console.Read();
}
}
class AttrAttribute : Attribute
{
public AttrAttribute()
{
Console.WriteLine("Hello world!");
}
}
然后控制台程序不会打印任何内容。但是当我调试程序时,我发现属性AttrAttribute的构造函数和Main方法确实都已执行。任何人都可以告诉我为什么..
如果我评论'Console.WriteLine(“Hello world!”);'在AttrAttribute的构造函数中,程序打印“Main end ..”..
谢谢大家。 (抱歉我的英语池。)
答案 0 :(得分:1)
首先,明确的事情是你必须明白,当Type
类调用GetCustomAttributes()
时,会创建属性。话虽如此,有意义的是你的属性构造函数中的Console.WriteLine
没有显示 - 你的程序尚未“正式”启动,因为它还没有输入Main(...)
。
现在,当我运行代码并测试它时,我发现了两件事。
Console.WriteLine
永远不会写入控制台。当我使用调试器运行并且属性的构造函数命中时,我可以在调试屏幕中看到Console
它已重定向所有输出/输入。当我单步执行并输入Main()
时,控制台仍在重定向。
在属性的构造函数中注释掉Console.WriteLine
会导致Console
在进入Main()
后重置。这让我相信在程序“正式”启动之前调用Console.WriteLine会导致控制台锁定到位并且不会重新初始化。
现在这只是一个猜测,但我怀疑Visual Studio在应用程序实例中捕获Console
,无论它在启动应用程序之前是否需要它。之前访问它,标记它不重置/重新初始化。