• 类型初始值设定项引发异常


     

    类型初始值设定项引发异常

    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
  • 相关阅读:
    mysql锁 实战测试代码
    Memcache教程 Memcache零基础教程
    Moneybookers API支付方式开发 步骤
    dede判断当前文章
    Windows下的Memcache安装 linux下的Memcache安装
    Ecshop:后台添加新功能栏目以及管理权限设置
    解决echsop兼容jquery(transport.js的冲突)的问题
    PHP AJAX JSONP实现跨域请求使用实例
    shell基础 -- 基本语法
    神器之strace
  • 原文地址:https://www.cnblogs.com/machine/p/3829249.html
Copyright © 2020-2023  润新知