簡體   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