類型初始值設定項引發異常


 

 

類型初始值設定項引發異常

1 引子

今天早上,准備修改已前寫的csharp程序,出現TypeInitializationException(類型初 始值設定項引發異常),這個以前沒發現,挺奇怪,在網上找到了問題原因。

1.1 問題定位

問題出現在sqlite數據庫操作,當打開數據庫時,出現:

未處理的“System.TypeInitializationException”類型的異常出現在 TemperApplication.exe 中。
其他信息: “TemperApplication.DataWareHouse.SetupSqlite”的類型初始值設定項引發異常。

原來類的sqlite類靜態成員在初始化時如果出現異常,訪問類的其它靜態成員或對該類進行 初始化都會拋出這個異常。sqlite代碼:

  /// <summary>
  /// 訪問sqlite數據庫底層類
  /// </summary>
  public class SetupSqlite
  {
    /// <summary>
    /// 屏蔽默認構造函數
    /// </summary>
    private SetupSqlite()
    {
    }
...
    private static SQLiteConnection _sql_con = null;
    private static SQLiteCommand _sql_cmd = null;
    private static SQLiteDataReader _dr = null;
    private static SQLiteTransaction _trans = null; 
  }

那么一定是_sql_con,_sql_cmd,_dr,_trans,這四個靜態變量初始化出現異常,我將這 四個靜態變量的初始化去掉,如下:

  /// <summary>
  /// 訪問sqlite數據庫底層類
  /// </summary>
  public class SetupSqlite
  {
    /// <summary>
    /// 屏蔽默認構造函數
    /// </summary>
    private SetupSqlite()
    {
    }
...
    /*
    private static SQLiteConnection _sql_con = null;
    private static SQLiteCommand _sql_cmd = null;
    private static SQLiteDataReader _dr = null;
    private static SQLiteTransaction _trans = null; 
    */
    private static SQLiteConnection _sql_con;
    private static SQLiteCommand _sql_cmd;
    private static SQLiteDataReader _dr;
    private static SQLiteTransaction _trans; 
  }

重新運行,TypeInitializationException異常不出現了,但出現新異常:

未處理的“System.BadImageFormatException”類型的異常出現在 TemperApplication.exe 中。
其他信息: 未能加載文件或程序集“System.Data.SQLite, Version=1.0.66.0,
Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一個依賴項。試圖加載格式
不正確的程序。

1.2 真正的原因

這說明,的確是四個靜態變量的初始化有問題,問題原因出在sqlite.dll加載上,這個dll 以前加載都沒有問題,問題一定出在別的地方,網上找到原因,是sqlite.dll分32位和 64位,以前用在32位下,現在開發換到win 7/x64下。

知道原因,修改就容易了,在項目屬性中,修改目平台,從Any CPU改為x86,重新運行正 常,再將四個靜態變量初始化恢復,運行也正常;明確問題,sqlite.dll是32位的,但目標 平台是x64的,有關sqlite的靜態變量初始化異常,引起sqlite類初始化錯誤,引發 TypeInitializationException異常。

Date: 2014-07-07 10:56:58

Author:

Org version 7.8.06 with Emacs version 23

Validate XHTML 1.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM