“ MyClass”的类型初始值设定项引发异常


217

以下是我的Windows服务代码。当我调试代码时,出现错误/异常:

“ CSMessageUtility.CSDetails”的类型初始值设定项引发了异常。

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();
                }
            }
        }
    }
}

5
检查静态成员的初始化。
罗宾诺2014年

Answers:


350

检查的InnerException属性TypeInitializationException;它可能包含有关潜在问题以及确切发生位置的信息。


4
感谢FredrikMörk,我得到了内部异常“对象引用未设置为对象的实例”。我正在检查
gofor.net 2010年

2
@ gofor.net:正如@Jackson Pope指出的那样;代码中有趣的部分是static CSDetails类中的方法CSMessageUtility.CSDetails(以及它可能调用的任何方法)。如果您自己找不到问题,请使用该代码更新问题。
FredrikMörk2010年

实际上CSMessageUtility是我正在使用的dll参考,其中包含几种方法。但是当我手动检查这些方法时,我没有得到任何error.it完美运行
gofor.net 2010年

2
异常并不总是有效的,也不是指向正确的问题。对我来说,它试图告诉我The input is not a valid Base-64 string as it contains a non-base 64 character函数返回到DataTable对象的原因,但是对我来说,实际上存在一个潜在的问题,即我app.config用错误的名称调用参数,因此我使用了一个变量来形成我的连接字符串为空。因此,它无法OracleConnection在该函数中打开以返回DataTable。最好的建议是深入研究返回错误的基础功能。
vapcguy

186

如果类尝试获取web.configapp.config中不存在的键的值,则可能导致此问题。

例如
,该类具有静态变量

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

但是web.config不包含GoogleCalendarApplicationClientID密钥

该错误将在任何静态函数调用任何类实例创建时引发


24
伙计,我永远不会独自发现这一点。我过分依赖点休息,可惜他们不会救我。谢谢芽!+1
Lukas

7
我同意 。。。我只是发生了完全相同的事情。在拉我的头发,试图弄清楚。非常感谢!
dscarr 2015年

3
在我的情况下是连接字符串。
Musakkhir说

1
你这家伙!你是救世主!没有丢失的配置条目,引用的项目甚至都无法调试(进入)。如果不深入研究该代码,就不会有任何与config问题相关的线索。我浪费了两天后,您节省了我的一周:P!
Pramod Sharma

1
@MuhammadWaqasIqbal最后一个加粗的句子是关键!!!ClientID在此示例中使用的任何函数都会出现此错误。很棒的帖子。
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. 意味着该类上的静态构造函数引发Exception-因此,您需要查看CSDetails类的静态构造函数,或者该类的任何静态成员的初始化。


1
果然。我正在创建导致问题的log4net记录器的静态实例。问题是该项目中的log4net程序集的版本与其他项目中的版本不匹配(我刚刚注意到shivan特别指出了这一点。)
goku_da_master

1
我在使用NLog时遇到了同样的问题。我倾向于在静态构造函数中初始化记录器,不同项目中版本之间的不匹配导致了问题。到处都使用相同的版本可以解决该问题。
shelbypereira

5

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

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



3

我有两个相同的配置属性(与app.config匹配)引起的相同问题:

    [ConfigurationProperty("TransferTimeValidity")]

2

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

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

请记住,您必须使用该OWSTIMER.EXE.CONFIG文件进行配置文件设置。我有一个App.config要读取的文件,却收到此错误,因为在实例化工作实例时,我的代码中有一行引用了Connfiguration.AppSettingsConfiguration.ConnectionStrings。只要确保您走的路:

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

并将您的配置设置放入OWSTIMER.EXE.CONFIG文件中。


2

如果您的依赖项属性注册了错误的所有者类型(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));
}

1

如果由于某种原因断电或Visual Studio IDE崩溃,则可能在bin / debug bin / release内部引起此问题...

只需删除内容并重新编译(从我的脚尖按下“重置”按钮时的个人经验即可)!


1

我有一个不同但仍相关的配置。

可能是未在configSections中声明的自定义配置节

只需声明该部分,错误即可自行解决。


1

由于程序集的运行时版本之间不匹配,我遇到了此问题。请验证主程序集(调用应用程序)和引用的程序集的运行时版本


1

如错误所述,类型/类的初始化失败。当类的构造函数中存在某些异常时,通常会发生这种情况。最常见的原因是您在构造函数中分配了一些值,该值是从配置文件读取的,而配置文件缺少这些值。


0

就我而言,我在Logger.Create上的主库(控制台)应用程序正在使用的类库中失败。问题是我忘记在控制台应用程序中添加对NLog.dll的引用。使用正确的.NET Framework库版本添加引用可以解决此问题。


0

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

DataTable myTable = FillTable(strMySqlQuery);

FillTable()基于SQL查询字符串返回一个DataTable。如果我选择了“将异常复制到剪贴板”选项,我认为是这样,然后将其粘贴到记事本中,则可以看到该消息。对我来说是The input is not a valid Base-64 string as it contains a non-base 64 character

我的实际问题不是查询字符串中有不该存在的内容,就像我在想的那样,因为string strMySqlQuery = "SELECT * FROM My_Table"我的字符串是并认为它可能是*or _,但是实际的问题是在FillTable(),在那里我有另一个电话函数,GetConnection()该函数返回一个OracleConnection对象,以便将其打开并检索并返回DataTable。在内部,GetConnection()我正在获取app.config连接字符串的参数,并且其中的一个名称被错误命名,因此它为服务帐户的密码设置了空值,并且未建立数据库连接。因此,并非总是在所有情况下错误都正确无误。最好深入研究错误所在的功能并逐步调试,并确保所有值都已填充您期望的值。


0

我也遇到两种情况的错误

  1. 在执行从BAL层到DAL层的重定向时,我遇到了此异常。内部异常表示“对象引用错误”。

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

希望这对解决您的问题有用。


0

类似于穆罕默德·伊克巴勒说..我是在VB.NET(也可能是C#)项目中,我也从删除键值对App.config,其被引用到一个变量全球Sub Main()Module Main。因此,异常(和中断)发生在Module Main之前Sub Main()。如果仅在上有一个断点Dim,但我们通常不会在全局变量上中断。也许是不声明引用App.config的全局变量的好理由吗?换句话说...

在未知模块中发生了类型为'System.TypeInitializationException'的未处理异常。'Namespace.Main'的类型初始值设定项引发了异常。

是由于...

App.config

<connectionStrings>
    <!--<add name="ConnectionString1" connectionString="..." />-->

主模块

Module Main
    Dim cnnString As String = ConfigurationManager.ConnectionStrings("ConnectionString1")  '<-- BREAK HERE (EXCEPTION)

    Sub Main()

        // main code

    End Main
End Module

0

就我而言,我有一个静态的助手类。在该类中是一个初始化依赖于变量的SqlCommand的方法。由于在多个地方都调用了此方法,因此将其移至帮助程序类并根据需要进行调用,因此该方法也是静态的。现在,我有一个全局属性,它是Global.asax中的连接字符串,指向web.config中的连接字符串。间歇性地,我会收到“'Helper'的类型初始值设定项引发异常”。如果我将方法从Helper类移到了被所有人调用的类,那就很好了。内部异常抱怨对象为空(Helper类)。我所做的是将Using Helper添加到Global.asax中,即使Global.asax并未使用它也解决了问题。


0

我的答案也与“配置”部分有关。如果在C#的静态类或VB的Module.VB的Config文件中分配值,则在运行时会出现此错误。

添加key =“ LogPath” value =“〜/ Error_Log /”

在Web.Config中使用正斜杠也会在运行时导致此错误。我刚刚通过放反斜杠解决了这个问题

添加key =“ LogPath” value =“〜\ Error_Log \”


0

我将崩溃的行包装在try-catch块中,打印出异常,并在打印后立即中断。所显示的异常信息具有堆栈跟踪,该堆栈跟踪将我指向导致错误发生的文件和代码行。

在此处输入图片说明

System.TypeInitializationException: The type initializer for 'Blah.blah.blah' threw an exception. 
---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Some.Faulty.Software..cctor() in C:\Projects\My.Faulty.File.cs:line 56
   --- End of inner exception stack trace ---
   at Blah.blah.blah(Blah.blah.blah)
   at TestApplication.Program.Main(String[] args) 
   in C:\Projects\Blah.blah.blah\Program.cs:line 29 Exception caught.



0

值得注意的是:我的解决方案中有多个项目,但是忘记添加引用/ Nuget库。当我在使用给定库的静态类中运行方法时,它抛出了所提到的异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.