2013-01-05 40 views
7

我正在研究一個C#項目,並希望利用UnhandledException事件來捕捉我可能在我的項目中錯過的任何異常(希望不會有任何但在同一側)。AppDomain UnhandledException

我做了很多軟件,所以我想創建一個類庫,我的所有項目都可以使用,所以我想有一個函數可以完成所有項目的所有初始化工作,而無需我將代碼複製並粘貼到每個項目中以完成相同的工作。

我想知道是,如果我在類庫有未處理的異常事件中使用下面的代碼

AppDomain currentDomain = AppDomain.CurrentDomain; 
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException); 

將未處理的異常只能從類庫中使用,或者將這個事件處理也從任何引用類庫的項目中免除。

感謝您提供的任何幫助。

回答

5

假設您的所有項目都在同一個應用程序域中運行,這將正常工作。我們將這個確切的代碼封裝在衆多應用程序共享的通用DLL中。

一個額外的建議:如果這用於Windows窗體應用程序,您可能還想爲System.Windows.Forms.Application.ThreadException添加處理程序。例如,當某人忘記向控制事件添加異常處理時,這起到了支持作用。

+0

感謝您的幫助。它的一個控制檯應用程序,我正在處理,但我會做一個不關於窗體的ThreadException。對於WPF應用程序或舊式Windows窗體,情況也是如此 – Boardy

1

可以將程序集加載到不同的應用程序域中,但只要將程序集(如類庫)加載到當前應用程序域中,就會處理該異常。

應用程序域和組件之間的關係:

http://technet.microsoft.com/en-us/subscriptions/index/43wc4hhs(v=vs.80).aspx

例如,Assembly.LoadFile()Assembly.Load()將所述組件加載到當前應用程序域。

你的代碼可以創建一個新的應用領域有:

AppDomain.CreateDomain(..),那麼它可能組件加載到這個領域,這將不會被你的代碼來處理。

如果您在項目中引用庫,它們將被加載到當前應用程序域中。