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.net\bin\OraOps11w.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.

/////////

 


免責聲明!

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



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