2011-02-02 44 views
3

我正在嘗試在我的應用程序中找到一個錯誤;一個未處理的異常。看起來這個異常是獨立於我的代碼觸發的地方。我能找到的唯一解釋是,我使用的程序集執行一些觸發異常的代碼。程序集是否有初始化和/或終止程序?

那麼程序集是否有初始化和/或終止例程或類似的東西?

+3

你有一個堆棧跟蹤? – LukeH 2011-02-02 10:44:41

+0

組件何時終止? – 2011-02-02 10:53:07

+0

完整的消息我得到的是:「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

回答

2
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對象。如果這些都沒有幫助,那麼你確實需要供應商的支持(統一)。

0

只要將適當的safegaurds放在適當的位置,就可以在類構造函數(或靜態構造函數)中執行此操作。

你想確保一旦MQ已經被註冊,你不要再試一次。你還要確保如果註冊失敗,你的構造函數不會拋出異常,而是設置類的狀態,使得該類被創建但不可用。在構造函數中拋出異常將導致非常模糊的「類型初始化失敗」錯誤消息。

更好的方法是創建一個管理與MQ的關係的單例類。單例在您的類構造函數中實例化一次。它需要提供一個明確的「註冊」方法,任何其他訪問MQ的方法都將成爲這個單例的一部分,並且可以隱式地利用寄存器方法。這樣做的好處是每次調用MQ時,系統都會驗證MQ是否已註冊,並且在進行調用之前是否註冊。

1

沒有,.NET程序集沒有初始化或終止例程

3

您可以將處理程序添加到應用程序域:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 

如果有異常被拋出這將現在被調用,並從那裏你可以得到調用堆棧。如果您在調試器下運行它,請轉到調試菜單 - >異常並勾選「引發」公共語言運行時異常。當拋出異常時,這將打破調試器。

1

C#不支持模塊初始值設定項是正確的,儘管CLB v2支持它們。這將需要修改IL來創建一個。見http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx

但是,我懷疑你的異常是由模塊初始化器中運行的代碼引起的。它看起來像SQLBaseCommand.Dispose一樣在Finalize時發生錯誤。因此,有幾個問題:

  1. 您是否在處置實現IDisposable的所有SQLBaseCommand和相關對象?如果沒有,那麼也許SQLBaseCommand類沒有正確地實現終結,你可以通過自己處置來避免這種情況(無論如何這是最佳實踐)。
  2. 看看你的人口和SQLBaseCommand對象的用法。它們是否根據API良好地形成?你是否以正確的模式使用它們?
  3. 獲取諸如Red Gate's Reflector(http://www.red-gate.com/products/dotnet-development/reflector/)之類的工具以查看反編譯的SQLBaseCommand C#代碼。查看Finalize和Dispose方法。什麼是期望不爲null,你可以忽略初始化或以任何方式受影響?
相關問題