2017-10-05 42 views
1

我已經有一個靜態的登錄助手類的網絡服務,看起來像這樣:雖然我的#define X,[條件(「X」)是預防的方法,從運行

#define LOGGING 
namespace blah 
{ 
    static class Log{ 
    class LogFile { ... } 

    [Conditional("LOGGING")] 
    public static void CreateLogFile(string path) { ... } 
    } 
} 


//in some other class 
void SetupLogger(){ 
    DateTime dtStart = DateTime.UtcNow; 
    Log.CreateLogFile("c:\\temp\\log.log"); 
    DateTime dtEnd = DateTime.UtcNow; 
} 

我在調試器中單步調試時沒有調用CreateLogFile方法的問題。在上述方法中,調試器從定義dtStart的行直接跳轉到定義dtEnd的行。我被這個迷惑,因爲如果我把

#if LOGGING 
    some code here 
#else 
    other code here 
#endif 

VisualStudio中會變灰other code here所以VS至少相信,測井變種被定義和駕駛代碼生成,但Conditional()屬性的行爲是相反..

我沒有任何#undef指令隨時隨地

是什麼公然錯與此設置?在本地IIS(非快速)中調試時,應該像這樣安排的靜態類能夠正常工作(即可調用CreateLogFile())?

+0

調用標有'Conditional'的方法會被包含在編譯時或不在編譯時,這似乎表明構建過程中有些不正確。嘗試刪除你的'#define'語句並添加「LOGGING」符號到項目 - >屬性 - >編譯 - >條件編譯符號 – BurnsBA

+1

看起來好像是從另一個程序集中調用CreateLogFile()方法,它沒有定義LOGGING符號。 LOGGING符號應該在調用程序集中定義。 –

+0

@IgorBendrup你應該把它作爲一個答案 - 我#定義LOGGING在我的其他類(在另一個.cs文件中,在另一個名稱空間中)也現在它按預期工作,謝謝..顯然,我不知道#定義關於條件屬性 - 如果你可以在你的答案中說幾句關於#define的範圍的東西,它會很棒 - 我不確定它是否是「相同的.cs文件」,「相同的命名空間「等 –

回答

1

看起來好像你是從另一個文件中調用CreateLogFile()方法,它沒有定義LOGGING符號。 LOGGING符號is the file where it have been defined的範圍。所以,LOGGING符號應該在文件中定義,其中包含SetupLogger()方法。

另一種方法是通過editing project properties爲整個裝配定義LOGGING符號。在這種情況下,您應該設置程序集的項目屬性,其中包含方法SetupLogger()

相關問題