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

Posted

技术标签:

【中文标题】“MyClass”的类型初始值设定项引发异常【英文标题】:The type initializer for 'MyClass' threw an exception 【发布时间】:2011-05-22 20:25:11 【问题描述】:

以下是我的 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();
                
            
        
    

【问题讨论】:

检查静态成员的初始化。 对我来说这是一个 exe,它在启动时出错,问题是这个 exe 的配置文件开头的一个简单的 TAB,选项卡在开始之前 【参考方案1】:

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. 表示该类的静态构造函数引发了异常 - 因此您需要查看 CSDetails 类的静态构造函数或该类的任何静态成员的初始化。

【讨论】:

果然。我正在创建导致问题的 log4net 记录器的静态实例。问题是该项目中 log4net 程序集的版本与其他项目中的版本不匹配(我刚刚注意到 shivan 特别指出。) 我在使用 NLog 时遇到了同样的问题。我倾向于在静态构造函数中初始化我的记录器,并且不同项目中版本之间的不匹配导致了这个问题。到处使用相同的版本解决了这个问题。【参考方案2】:

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

【讨论】:

感谢 Fredrik Mörk 我得到了内部异常“对象引用未设置为对象的实例。”我正在检查它 @gofor.net:正如@Jackson Pope 指出的那样;代码中有趣的部分是CSMessageUtility.CSDetails 类中的方法static CSDetails(以及它可能调用的任何方法)。如果您自己没有发现问题,请使用该代码更新问题。 实际上 CSMessageUtility 是我正在使用的 dll 参考,其中包含几种方法。但是当我手动检查这些方法时,我没有收到任何错误。它完美地工作 异常并不总是有效或指向正确的问题。对我来说,它试图告诉我 The input is not a valid Base-64 string as it contains a non-base 64 character 一个函数返回到 DataTable 对象的内容,但对我来说,实际上存在一个潜在问题,即我用错误的名称调用了 app.config 参数,所以变量我用来形成我的连接字符串为空。因此它无法在该函数中打开OracleConnection 以返回DataTable。最好的建议是深入研究返回错误的底层函数。【参考方案3】:

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

例如 该类有一个静态变量

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

web.config 不包含 GoogleCalendarApplicationClientID

任何静态函数调用任何类实例创建

都会引发错误

【讨论】:

伙计,我永远不会自己发现这一点。我太依赖破点了,唉,他们不会救我的。谢谢芽! +1 我同意。 . .我刚刚发生了完全相同的事情。正在拉我的头发试图弄清楚。非常感谢! 在我的例子中是连接字符串。 你这个摇滚人!你是救世主!如果没有缺少配置条目,引用的项目甚至没有调试(进入)。如果不深入研究该代码,就没有与配置问题相关的线索。在我浪费了 2 天之后,你拯救了我的一周:P! @MuhammadWaqasIqbal 最后一个粗体字是关键!!!在此示例中使用 ClientID 的任何函数都会出现此错误。很棒的帖子。【参考方案4】:

如果由于某种原因断电或 Visual Studio IDE 崩溃,可能会在您的 bin/debug bin/release 中导致此问题...

只需删除内容并重新编译(根据我的脚趾按下重置按钮时的个人经验!)

【讨论】:

【参考方案5】:

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

问题是在类的静态初始化过程中(使用静态构造函数),框架还初始化了类中的静态变量(字段)。我有一个静态变量尝试从app.config 读取值,而app.config 缺少相应的设置,从而导致未处理的异常。这导致获得

“对象引用未设置为对象的实例。”

作为内部异常。

【讨论】:

【参考方案6】:

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

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 文件中。

【讨论】:

【参考方案7】:

检查何时引发这些初始化错误的另一件事是检查服务器上是否安装了目标 .NET 版本。您可以右键单击该项目并查看应用程序所针对的 .NET 版本。

【讨论】:

【参考方案8】:

由于有两个相同的配置属性(与 app.config 匹配),我遇到了同样的问题:

[ConfigurationProperty("TransferTimeValidity")]

【讨论】:

【参考方案9】:

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

可能是未在 configSections 中声明的自定义配置部分。

只需声明该部分,错误就会自行解决。

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

在 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" 是我的字符串并且认为它可能是*_,但是实际问题出在FillTable(),在那里我调用了另一个函数GetConnection(),它返回了一个OracleConnection 对象,以便打开它并检索并返回DataTable。在GetConnection() 内部,我得到了连接字符串的app.config 参数,其中一个参数命名错误,因此它为服务帐户的密码设置了一个空值,而不是建立数据库连接。因此,错误并不总是在所有情况下都完全正确。最好深入了解错误所在的函数并逐步调试,并确保所有值都符合您的预期。

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

我在两种情况下也遇到过这个错误

    在执行从 BAL 层到 DAL 层的重定向时,我遇到了这个异常。内部异常说“对象引用错误”。

    Web.Config 文件密钥不匹配。

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

【讨论】:

【参考方案15】:

类似于 Muhammad Iqbal 所说的。我在一个 VB.NET(也可能是 C#)项目中确实从 App.config 中删除了一个键值对,该键值对被一个全局变量引用到 @987654322 @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

【讨论】:

【参考方案16】:

在我的例子中,我有一个静态的辅助类。在那个类中有一个方法来初始化依赖于变量的 SqlCommand。由于这在几个地方被调用,我将它移到帮助类并根据需要调用,所以这个方法也是静态的。现在我有一个全局属性,它是 Global.asax 中的连接字符串,指向 web.config 中的连接字符串。我会间歇性地得到“'Helper' 的类型初始化程序引发异常”。如果我将方法从 Helper 类移到从所有调用它的类中是好的。内部异常抱怨对象为空(Helper 类)。我所做的是将 Using Helper 添加到 Global.asax,即使 Global.asax 没有使用它,这也解决了问题。

【讨论】:

【参考方案17】:

我的答案也与配置部分有关。如果您在 C# 的静态类或 VB 的 Module.VB 的 Config 文件中分配值,您将在运行时收到此错误。

添加 key="LogPath" value="~/Error_Log/"

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

添加 key="LogPath" value="~\Error_Log\"

【讨论】:

【参考方案18】:

我将崩溃的行包裹在 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.

【讨论】:

【参考方案19】:

以某种方式退出 Visual Studio 并重新打开它为我解决了这个问题。

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】:

字典键应该是唯一的!

在我的例子中,我使用的是字典,我发现其中的两个项目意外地具有相同的键。

Dictionary<string, string> myDictionary = new Dictionary<string, string>() 
            "KEY1", "V1",
            "KEY1", "V2" ,
            "KEY3", "V3",
        ;

【讨论】:

【参考方案22】:

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

【讨论】:

以上是关于“MyClass”的类型初始值设定项引发异常的主要内容,如果未能解决你的问题,请参考以下文章

类型初始值设定项引发异常。C# web

Emgu.CV.CvInvoke”的类型初始值设定项引发异常。

Emgu.CV.CvInvoke”的类型初始值设定项引发异常

类型初始值设定项引发异常

“Emgu.CV.CvInvoke”的类型初始值设定项引发异常。

浪潮GS7提示类型初始值设定项引发异常,该怎么解决?