2012-08-27 28 views
3

有沒有什麼辦法可以讓我的代碼知道「我在正常的進程上下文中執行」和「我已經從調試器的立即窗口執行」之間的區別?如何判斷我的代碼是否已從即時窗口調用?

我有一個庫對象公開的屬性。當使用該庫的發佈版本,但調試已加載包含該庫的DLL的應用程序時,如果從立即窗口(x.prop = true)更改屬性,我希望我的屬性代碼檢測到並執行不同。

有沒有辦法檢測到這個?

爲了方便起見,當我使用該庫的調試版本時,我也想這樣工作。所以,我不能檢查是否有調試器連接,並從那裏分支。

+1

當你等待有人回答,試着玩[StackTrace](htt p://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v = vs.100).aspx)類,並查看是否可以從調用的調用堆棧中得知。它可能很明顯是來自調試器組件。 – HABO

+0

http://stackoverflow.com/questions/2188201/is-there-a-way-to-detect-if-a-debugger-is-attached-to-a-process-from-c-sharp你可以試試這個 –

+0

@Paul,謝謝,但那個系統使用了Debugger.IsAttached,我指定的不能在這裏工作,因爲這個代碼也會在我調試庫本身時運行... – Joe

回答

1

有一件事我一直注意到的是,從即時窗口任何電話至少包含一個電話從以下命名空間起源:

Microsoft.VisualStudio.HostingProcess 

所以,如果你有,說:

public static string DumpStack() 
{ 
    return new StackTrace().ToString(); 
} 

你會看到類似的東西:

at ConsoleApplication1.Program.DumpStack() 
    at ConsoleApplication1.Program.Main(String[] args) 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
相關問題