“MyClass”的types初始值设定项引发exception

以下是我的Windows服务代码。 当我debugging代码时,我得到了错误/exception:

“CSMessageUtility.CSDetails”的types初始值设定项引发exception。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.IO; using System.Threading; using System.Windows; using System.Windows.Forms; using CSMessageUtility; namespace CS_Data_Trasmmiting_Service { public partial class svcCSWinServ : ServiceBase { //private string sLogFormat; //private string sErrorTime; private Thread new_thread; Logger logObject = new Logger(); private bool isenable = true; public svcCSWinServ() { InitializeComponent(); logObject.append("Initialize Service " + DateTime.Now.ToString(), 70); CheckForAlarms(); } protected override void OnStart(string[] args) { try { new_thread = new Thread(new ThreadStart(CheckForAlarms)); new_thread.Start(); } catch { } logObject.append("Service Started successfully " + DateTime.Now.ToString(), 70); } protected override void OnStop() { try { isenable = false; new_thread.Abort(); } catch { } logObject.append("Service Stopped successfully " + DateTime.Now.ToString(), 70); } void CheckForAlarms() { try { while (true) { //if((DateTime.Now.ToString("HH:mm") == "18:00")) //{ logObject.append("Start Sending Data " +DateTime.Now.ToString(), 70); try { //SendAllInfo(); string str = CSMessageUtility.CSDetails.createDHSMessageFormat(); Thread.Sleep(2000); string str1 = CSMessageUtility.CSDetails.createEALMessageFormat(); Thread.Sleep(2000); string str2 = CSMessageUtility.CSDetails.createProductStatusMessageForamt(); Thread.Sleep(2000); string str3 = CSMessageUtility.CSDetails.createEODMessageFormat(); Thread.Sleep(2000); string str4 = CSDetails.createProductReceiptEntryatBOSMessageFormat(); Thread.Sleep(2000); string str5 = CSMessageUtility.CSDetails.createProductSaleMessageFormat(); Thread.Sleep(2000); string str6 = CSMessageUtility.CSDetails.createTotalizerExceptionMessageFormat(); Thread.Sleep(2000); //CSMessageUtility.CSDetails.createDailyCOtransferMessageFormat(); //Thread.Sleep(2000); } catch (Exception ee) { logObject.append(ee.Message, 70); } logObject.append("Finished Sending Data " +DateTime.Now.ToString(), 70); Thread.Sleep(3000); //} //Thread.Sleep(20000); } } catch (Exception ex) { logObject.append("Thread Exception: "+ ex.Message + " "+ DateTime.Now.ToString(), 70); try { new_thread.Abort(); } catch (Exception ex1) { logObject.append("Thread Exception: " +ex1.Message + " " + DateTime.Now.ToString(), 70); } if (isenable == true) { new_thread = new Thread(new ThreadStart(CheckForAlarms)); new_thread.Start(); } } } } } 

检查TypeInitializationExceptionInnerException属性; 它可能包含有关潜在问题的信息,以及确切发生的地方。

如果一个类尝试获取web.config或app.config中的某个键的值(例如,该键不存在),则可能导致此问题

该类有一个静态variables

 private static string ClientID = System.Configuration.ConfigurationSettings.AppSettings["GoogleCalendarApplicationClientID"].ToString(); 

但web.config不包含“GoogleCalendarApplicationClientID”键

该错误将在任何静态函数调用任何类实例创build时抛出

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. 意味着这个类的静态构造函数抛出了一个exception – 所以你需要查看CSDetails类的静态构造函数,或者该类的静态成员的初始化。

当我在Util类中使用静态方法时,遇到了同样的问题,就像您使用“CSMessageUtility.CSDetails”一样。

问题是,在类的静态初始化期间(使用静态构造函数),框架还初始化类中的静态variables(字段)。 我有一个静态variables,试图从app.config读取值,并且app.config缺less相应的设置,从而导致一个未处理的exception。 这导致获得“对象引用未设置为对象的实例”。 作为内在的例外。

还有一件事要检查这些初始化错误是什么时候会检查目标.NET版本是否安装在服务器上。 您可以右键单击该项目,查看该应用程序所针对的.NET版本。

我有两个相同的configuration属性(与app.config匹配)导致相同的问题:

  [ConfigurationProperty("TransferTimeValidity")] 

如果您有一个注册到错误所有者types(ownerType参数)的依赖项属性,就会发生这种情况。

注意SomeOtherControl应该是YourControl。

 public partial class YourControl { public bool Enabled { get { return (bool)GetValue(EnabledProperty); } set { SetValue(EnabledProperty, value); } } public static readonly DependencyProperty EnabledProperty = DependencyProperty.Register(nameof(Enabled), typeof(bool), typeof(SomeOtherControl), new PropertyMetadata(false)); } 

另一个可能导致这种情况的情况是当你有一段代码调用:

 string sParam = **ConfigurationManager.AppSettings["SOME_PARAM"].ToString(); 

请记住,您必须使用OWSTIMER.EXE.CONFIG文件进行configuration文件设置。 我有一个App.config文件,我正在尝试阅读,我得到这个错误,因为在我的工作实例的实例化,我在我的代码中引用Connfiguration.AppSettingsConfiguration.ConnectionStrings Connfiguration.AppSettings 。 只要确保你走的path:

 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN 

并将您的configuration设置放在OWSTIMER.EXE.CONFIG文件中。

如果无论出于何种原因电源运行或者Visual Studio IDE崩溃,都可能导致bin / debug bin / release内发生这个问题。

只要删除内容,并重新编译(从我的脚趾点击重置button的个人经验!)

我有一个不同的,但仍然相关的configuration。

可能是未在configSections中声明的自定义configuration节。

只要声明该部分,错误应该自行解决。

我遇到了这个问题,因为程序集的运行时版本之间不匹配。 请validation主程序集(调用应用程序)和引用的程序集的运行时版本

在我的情况下,我有这个失败Logger.Create内部正在使用我的主(控制台)应用程序的类库。 问题是我忘记了在我的控制台应用程序中添加对NLog.dll的引用。 使用正确的.NET Framework库版本添加引用可解决问题。

在WPF项目中有这样的情况。 我的问题是这样的:

 DataTable myTable = FillTable(strMySqlQuery); 

其中FillTable()基于SQL查询string返回DataTable。 如果我做了“复制剪贴板例外”选项,我想是的,并粘贴到记事本中,我可以看到消息。 对我来说,这是The input is not a valid Base-64 string as it contains a non-base 64 character

我的实际问题不在于查询string不应该在那里,就像我在想,因为string strMySqlQuery = "SELECT * FROM My_Table"是我的string,并认为它可能是*_ ,但实际问题出在FillTable() ,在那里我调用了另一个函数GetConnection() ,它返回一个OracleConnection对象,以便打开它并检索并返回DataTable。 里面GetConnection()我得到了我的连接string的app.config参数,我有一个误称,所以它是为服务帐户的密码设置一个空值,而不是数据库连接。 所以在任何情况下,错误并不总是正确的。 最好深入了解错误所在的function,并逐步进行debugging,并确保所有值都满足您的期望。

在两种情况下我也面临这个错误

  1. 当执行从BAL层到DAL层的redirect时,我面临这个例外。 内部exception说“对象引用错误”。

  2. Web.Config文件密钥不匹配。

希望这有助于解决您的问题。