the type initializer for '' threw an exception
調查:查看類的構造函數是否會有異常拋出。
解決:去掉類的構造函數中可能出現的異常。
問題:.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,有時間需要研究一下為什么...
為了解決問題我嘗試了用更新的版本。但是他還是會拋出同樣的問題。
最后我想起了.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.
/////////

