我正在嘗試在我的應用程序中找到一個錯誤;一個未處理的異常。看起來這個異常是獨立於我的代碼觸發的地方。我能找到的唯一解釋是,我使用的程序集執行一些觸發異常的代碼。程序集是否有初始化和/或終止程序?
那麼程序集是否有初始化和/或終止例程或類似的東西?
我正在嘗試在我的應用程序中找到一個錯誤;一個未處理的異常。看起來這個異常是獨立於我的代碼觸發的地方。我能找到的唯一解釋是,我使用的程序集執行一些觸發異常的代碼。程序集是否有初始化和/或終止程序?
那麼程序集是否有初始化和/或終止例程或類似的東西?
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei Unify.SQLBase.Data.SQLBaseCommand.Dispose
bei Unify.SQLBase.Data.SQLBaseCommand.Finalize
是的,這是一個非常討厭的例外。它由SQLBaseCommand類的終結器引發。當終結器線程運行時會發生什麼。這與你的代碼是完全異步的,它可以在任何時候觸發。 CLR將立即終止您的程序。
這是您正在使用的數據庫提供程序中的一個討厭的錯誤,SQLBase的聲音。很難相信他們會提供這樣的bug。查找該提供程序的更新後,請仔細查看您在代碼中創建的SqlCommand對象。如果這些都沒有幫助,那麼你確實需要供應商的支持(統一)。
只要將適當的safegaurds放在適當的位置,就可以在類構造函數(或靜態構造函數)中執行此操作。
你想確保一旦MQ已經被註冊,你不要再試一次。你還要確保如果註冊失敗,你的構造函數不會拋出異常,而是設置類的狀態,使得該類被創建但不可用。在構造函數中拋出異常將導致非常模糊的「類型初始化失敗」錯誤消息。
更好的方法是創建一個管理與MQ的關係的單例類。單例在您的類構造函數中實例化一次。它需要提供一個明確的「註冊」方法,任何其他訪問MQ的方法都將成爲這個單例的一部分,並且可以隱式地利用寄存器方法。這樣做的好處是每次調用MQ時,系統都會驗證MQ是否已註冊,並且在進行調用之前是否註冊。
沒有,.NET程序集沒有初始化或終止例程
您可以將處理程序添加到應用程序域:
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
如果有異常被拋出這將現在被調用,並從那裏你可以得到調用堆棧。如果您在調試器下運行它,請轉到調試菜單 - >異常並勾選「引發」公共語言運行時異常。當拋出異常時,這將打破調試器。
C#不支持模塊初始值設定項是正確的,儘管CLB v2支持它們爲。這將需要修改IL來創建一個。見http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx。
但是,我懷疑你的異常是由模塊初始化器中運行的代碼引起的。它看起來像SQLBaseCommand.Dispose一樣在Finalize時發生錯誤。因此,有幾個問題:
你有一個堆棧跟蹤? – LukeH 2011-02-02 10:44:41
組件何時終止? – 2011-02-02 10:53:07
完整的消息我得到的是:「System.NullReferenceException:明鏡Objektverweis wurde nicht奧夫EINE Objektinstanz festgelegt 貝Unify.SQLBase.Data.SQLBaseCommand.Dispose 貝Unify.SQLBase.Data.SQLBaseCommand.Finalize」 – Luke 2011-02-02 10:55:05