zoukankan      html  css  js  c++  java
  • the type initializer for '' threw an exception

    the type initializer for '' threw an exception

    问题:程序启动时初始化主窗口类时,弹出该错误。
    调查:查看类的构造函数是否会有异常抛出。
    解决:去掉类的构造函数中可能出现的异常。
    //////////////////////
    环境:windows 2003 x64,Oracle 10g x64,odp.net(正确安装),.net framework 4
    问题:.net应用程序通过Oracle.DataAccess.dll访问64位的Oracle服务器,在连接时出现以下异常:“System.TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception. ---> Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容
    通过windows的事件查看器,发现类似如下应用程序错误:
    事件类型:错误
    事件来源:
    事件种类:无
    事件 ID:0
    日期:2011-10-20
    事件:15:25:18
    用户:N/A
    计算机:
    描述:
    Service cannot be started. System.TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception. ---> Oracle.DataAccess.Client.OracleException:提供程序与此版本的 Oracle 客户机不兼容

    事件类型:错误
    事件来源:.NET Runtime 4.0 Error Reporting
    事件种类:无
    事件 ID:5000
    日期:2011-10-20
    事件:15:25:19
    用户:N/A
    计算机:
    描述:
    EventType clr20r3, P1 dbsupport.exe, P2 1.0.0.0, P3 4e9d2829, P4 oracle.dataaccess, P5 4.112.2.0, P6 4cea1964, P7 6cc, P8 1f5, P9 oracle.dataaccess.client.oracle, P10 NIL.

    如下系统错误:
    事件类型:错误
    事件来源:SideBySide
    事件种类:无
    事件 ID:59
    日期:2011-10-20
    事件:15:25:18
    用户:N/A
    计算机:
    描述:
    Generate Activation Context 为 C:odp.netinOraOps11w.dll 失败。 参考错误消息: 参照的汇编没有安装在系统上

    事件类型:错误
    事件来源:SideBySide
    事件种类:无
    事件 ID:32
    日期:2011-10-20
    事件:15:39:28
    用户:N/A
    计算机:
    描述:
    找不到附属汇编 Microsoft.VC80.CRT,上一个错误是 参照的汇编没有安装在系统上。

    事件类型:错误
    事件来源:SideBySide
    事件种类:无
    事件 ID:59
    日期:2011-10-20
    事件:15:39:28
    用户:N/A
    计算机:
    描述:
    Resolve Partial Assembly 为 Microsoft.VC80.CRT 失败。 参考错误消息: 参照的汇编没有安装在系统上。

    原因
    服务器安装的.net framework 中缺少以下两个包:
    Microsoft Visual C++ 2005 Redistributable Package,
    Microsoft Visual C++ 2005 SP1 Redistributable Package

    解决方法
    下载上述包,并安装到服务器上。
    下载地址:
    http://www.microsoft.com/download/en/details.aspx?id=21254
    http://www.microsoft.com/download/en/details.aspx?id=18471
    /////////////////////

    今天写程序想实现一个Singleton模式,结果程序老是抛异常说"The type initializer for 'TestStatic.StaticClass' threw an exception.",InnerException是"Object reference not set to an instance of an object",后来发现犯了一个非常低级的错误,代码如下:

        // In main.cs

        static void Main()
        {
          string t = StaticClass.StrMember;
          System.Diagnostics.Debug.WriteLine(t);

          ...
        }

        // StaticClass.cs
        private StaticClass(int defValue)
        {
          Trace.WriteLine("StaticClass ctor");
          IntMember = defValue;
        }

        private static StaticClass _instance = new StaticClass(12);
        private int intMember;
        public static int IntMember
        {
          set
          {
            Trace.WriteLine("set IntMember");
            _instance.intMember = value;
          }
        }

    看出问题了吗?问题就出在

                                               IntMember = defValue;

    这句话,为这个静态属性赋值的时候其实是为静态成员_instance的intMember成员赋值,而此时_instance还是null,必须等待构造函数结束以后_instance才会被赋值为新建StaticClass对象的引用。所以应该把

                                               IntMember = defValue;

    改写为

                                               this.intMember = defValue;

    就一切正常了。调了很久,实在是很郁闷...

    总结如下:首先当然是编程水平问题 :P,对Singleton模式一知半解。另外在构造函数里初始化静态属性也不是可取的做法。第三,之所以调试了很久,是因为Visual Studio没有明确的定位异常发生的代码段:总是在main函数的"string t = StaticClass.StrMember;"语句处报异常,非常的misleading,有时间需要研究一下为什么...

    //////////////////////
    主要是不能连接ORACLE数据库,连接DLL用的是 版本为2.112.1.2的ORACLE.DATAACCESS.DLL,在我自己的电脑上运行没有问题,在服务器端运行就会抛出异常。

     为了解决问题我尝试了用更新的版本。但是他还是会抛出同样的问题。

     最后我想起了.NET中自带有微软的ORACLE访问借口,于是我就用了SYSTEM.DATA.ORACLECLIENT这个组件,问题得到了解决。

     部分代码:(注释的就是调用的ORACLE.DATAACCESS.DLL组件的方法)

    复制代码
     1  protected DataSet GetData()
     2         {
     3 
     4             //Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connstr);
     5             System.Data.OracleClient.OracleConnection conn = new OracleConnection(connstr);
     6             try
     7             {
     8                 conn.Open();
     9                 //Oracle.DataAccess.Client.OracleCommand com = conn.CreateCommand();
    10                 OracleCommand com = conn.CreateCommand();
    11                 com.CommandText = "select * from DL_GOVT_NOTICE_INFO";//"select * from DL_GOVT_NOTICE_EXP_HIST";
    12                 //Oracle.DataAccess.Client.OracleDataAdapter apter = new Oracle.DataAccess.Client.OracleDataAdapter(com);
    13                 OracleDataAdapter apter = new OracleDataAdapter(com);
    14                 DataSet ds = new DataSet();
    15                 apter.Fill(ds);
    16                 apter.Dispose();
    17                 conn.Dispose();
    18                 return ds;
    19             }
    20             catch (Exception ex)
    21             {
    22                 this.LabShowInfo.Text = "Error: " + ex.Message;
    23                 conn.Close();
    24                 return null;
    25             }
    26            
    27         }
    复制代码


     详细情况我现在也还很糊涂,希望对有出现类似情况的同志有所帮助。

    //////////////////

    Both Oracle Data Provider for .NET (from Oracle) and .NET Framework Data Provider for Oracle (from Microsoft) require Oracle Client installed on machine.

    /////////

  • 相关阅读:
    angularjs 表单验证
    (原)Eclipse Tomcat配置(2014.12.27——By小赞)
    Eclipse SVN插件安装与使用(2014.12.27——by小赞)
    Eclipse 下载与安装(2014.12.26——by小赞)
    MySQL开启远程链接(2014.12.12)
    360手机助手使用问题
    WORD文档的长串数字如何粘贴到excel
    EJB 总结学习(1)
    EJB (not bound)
    JQ绑定事件(1.9已经废除了live()等绑定事件方法,on()方法是官方推荐的绑定事件的一个方法)
  • 原文地址:https://www.cnblogs.com/zeroone/p/3249803.html
Copyright © 2011-2022 走看看