2014-02-22 58 views
0

我遇到我的時候通過自定義裝飾我的主要方法,一件奇怪的事情屬性這樣的:C#的主要方法,通過自定義屬性裝飾

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

我剛剛運行相同的代碼,基本上''AttrAttribute'構造函數正在控制檯甚至存在之前運行。我的猜測是控制檯不會存在,直到控制檯應用程序的入口點「Main」開始執行。你試圖用你的屬性來完成什麼?爲什麼它要打印到控制檯? –

+0

它是探測STA/MTAThread屬性的主機進程。項目+屬性,調試選項卡,取消選項,它將停止。 –

+0

謝謝AdamVenezia,Dexters,Hans Passant。而@Dexters提供的鏈接非常有用。 – Lcng

回答

1

首先,很明顯的是,你必須明白,類'Type調用GetCustomAttributes()時創建的屬性。有人說,這是有道理的,你的屬性的構造函數中的Console.WriteLine沒有顯示 - 你的程序還沒有「正式」啓動,因爲它還沒有輸入Main(...)

現在,當我運行代碼並測試它時,我發現了兩件事。

  1. 我使用調試器運行時出現問題。 Console.WriteLine從不寫入控制檯。
  2. 不要當我沒有調試器運行時得到你的問題。

當我使用調試器運行並且屬性的構造函數命中時,我可以在調試屏幕中看到Console它的所有輸出/輸入都被重定向。當我步入並輸入Main()時,控制檯仍在重定向。

註釋掉屬性構造函數中的Console.WriteLine會導致Console在進入Main()後重置。這使我相信,在程序「正式」啓動之前調用Console.WriteLine會導致控制檯鎖定到位並且不會重新初始化。

現在,這只是一個猜測,但我懷疑Visual Studio在您的應用程序實例中捕獲了Console,無論它在啓動應用程序之前需要它。在之前訪問它,標記它不重置/重新初始化。

+0

謝謝。我只是想確保'只有自定義屬性的ctor纔會被執行,當你通過反射來訪問它'。現在我明白了。謝謝你的解釋。 – Lcng