【问题标题】:C# Main method decorated by a custom attribute [duplicate]由自定义属性修饰的 C# Main 方法[重复]
【发布时间】:2014-02-22 04:01:08
【问题描述】:

当我用这样的自定义 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..”..

谢谢大家。 (对不起,我的泳池英语。)

【问题讨论】:

  • 我只是运行了相同的代码,基本上 AttrAttribute 构造函数在控制台存在之前就已经运行了。我的猜测是控制台将不存在,直到控制台应用程序的入口点Main 开始执行。你想用你的属性来完成什么,为什么它会打印到控制台?
  • 托管进程正在探测 STA/MTAThread 属性。项目+属性,调试选项卡,取消勾选该选项,它将停止。
  • 谢谢您,AdamVenezia、Dexters、Hans Passant。 @Dexters 提供的链接非常有用。

标签: c# attributes


【解决方案1】:

首先,要清楚的是,您必须了解属性是在类Type 调用GetCustomAttributes() 时创建的。话虽如此,属性构造函数中的Console.WriteLine 没有显示是有道理的——你的程序还没有“正式”启动,因为它还没有输入Main(...)

现在,当我运行代码并对其进行测试时,我发现了两件事。

  1. 我在使用调试器运行时遇到了您的问题。 Console.WriteLine 从不写入控制台。
  2. 当我在没有调试器的情况下运行时,我没有遇到您的问题。

当我使用调试器运行并且属性的构造函数命中时,我可以在Console 的调试屏幕中看到它的所有输出/输入都被重定向。当我逐步输入Main() 时,控制台仍在被重定向。

在属性的构造函数中注释掉Console.WriteLine 会导致Console 在进入Main() 后被重置。这让我相信在你的程序“正式”启动之前调用 Console.WriteLine 会导致控制台被锁定在适当的位置而不是重新初始化。

现在这部分只是一个猜测,但我怀疑 Visual Studio 在启动您的应用程序之前会在您的应用程序实例中捕获Console 以获取它需要的任何内容。之前访问它,将其标记为不重置/重新初始化。

【讨论】:

  • 谢谢。我只是想确保“自定义属性的 ctor 只会在您通过反射访问它时执行”。现在我明白了。谢谢你的解释。
猜你喜欢
  • 2011-07-11
  • 2013-04-10
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多