繁体   English   中英

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

[英]The type initializer for 'MyClass' threw an exception

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

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

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

例如
该类有一个静态变量

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

web.config不包含GoogleCalendarApplicationClientID

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

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. 意味着该类上的静态构造函数抛出了一个异常 - 因此您需要查看 CSDetails 类的静态构造函数,或该类的任何静态成员的初始化。

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

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

“你调用的对象是空的。”

作为内部例外。

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

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

[ConfigurationProperty("TransferTimeValidity")]

如果您的依赖属性注册到错误的所有者类型(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文件进行配置文件设置。 我有一个App.config文件,我试图读取它,但我收到此错误,因为在实例化我的作业实例时,我的代码中有一行指的是Connfiguration.AppSettings & Configuration.ConnectionStrings 只要确保你走这条路:

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

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

字典键应该是唯一的!

就我而言,我使用的是字典,我发现其中的两个项目意外具有相同的键。

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

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

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

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

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

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

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

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

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

在 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参数,并且其中一个参数命名错误,因此它为服务帐户的密码设置了一个空值,而不是建立数据库连接。 因此,对于所有情况,错误并不总是完全正确。 最好深入了解错误所在的函数并逐步调试,并确保所有值都符合您的期望。

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

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

  2. Web.Config文件键不匹配。

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

类似于 Muhammad Iqbal 所说的......我在一个 VB.NET(也可能是 C#)项目中,我确实从App.config删除了一个键值对,它被一个全局变量引用到Sub Main() Module Main 因此,异常(和中断)发生在Sub Main()之前的Module Main 如果我在Dim上有一个断点Dim ,但我们通常不会在全局变量上中断。 也许一个很好的理由不声明引用 App.config 的全局变量? 换句话说,这...

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

是由...

应用配置

<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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM