Der Typinitialisierer für 'MyClass' hat eine Ausnahme ausgelöst


217

Das Folgende ist mein Windows-Dienstcode. Wenn ich den Code debugge, erhalte ich den Fehler / die Ausnahme:

Der Typinitialisierer für 'CSMessageUtility.CSDetails' hat eine Ausnahme ausgelöst.

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
Überprüfen Sie die Initialisierung der statischen Elemente.
Robino

Antworten:


350

Überprüfen Sie die InnerExceptionEigenschaft des TypeInitializationException; Es enthält wahrscheinlich Informationen über das zugrunde liegende Problem und genau den Ort, an dem es aufgetreten ist.


4
danke Fredrik Mörk Ich habe die innere Ausnahme "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt." Ich überprüfe es
gofor.net

2
@ gofor.net: wie @Jackson Pope betont; Der interessante Teil Ihres Codes ist die Methode static CSDetailsin der Klasse CSMessageUtility.CSDetails(und alle Methoden, die sie aufruft). Wenn Sie das Problem nicht selbst finden, aktualisieren Sie die Frage mit diesem Code.
Fredrik Mörk

Tatsächlich ist CSMessageUtility eine DLL-Referenz, die ich verwende, und diese enthält die verschiedenen Methoden. aber wenn ich diese Methoden manuell überprüfe, habe ich keinen Fehler erhalten. Es funktioniert perfekt
gofor.net

2
Die Ausnahme ist nicht immer gültig oder weist auf das richtige Problem hin. Für mich wurde versucht, mir mitzuteilen, The input is not a valid Base-64 string as it contains a non-base 64 characterwofür eine Funktion zu einem DataTable-Objekt zurückkehrt, aber für mich gab es tatsächlich ein zugrunde liegendes Problem, bei dem ich einen app.configParameter mit dem falschen Namen aufrief, also eine Variable, mit der ich meinen Verbindungsstring bildete war null. Daher konnte die OracleConnectionFunktion in dieser Funktion nicht geöffnet werden, um die Datentabelle zurückzugeben. Der beste Rat ist, in die zugrunde liegende Funktion einzutauchen, die den Fehler zurückgibt.
Vapcguy

186

Dieses Problem kann verursacht werden, wenn eine Klasse versucht, den Wert eines Schlüssels in web.config oder app.config abzurufen, der dort nicht vorhanden ist.

zB
Die Klasse hat eine statische Variable

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

Die web.config enthält jedoch keinen GoogleCalendarApplicationClientIDSchlüssel

Der Fehler wird bei jedem statischen Funktionsaufruf oder jeder Klasseninstanzerstellung ausgelöst


24
Mann, ich hätte das nie alleine herausgefunden. Ich habe mich zu sehr auf Punktbrüche verlassen und leider hätten sie mich nicht gerettet. Danke, Alter! +1
Lukas

7
Genau . . . Ich hatte genau das gleiche passiert. Ich zog mir die Haare aus und versuchte es herauszufinden. Danke vielmals!
dscarr

3
In meinem Fall war es eine Verbindungszeichenfolge.
Musakkhir Sayyed

1
Du rockst Mann! Du bist ein Retter! Das referenzierte Projekt debuggte nicht einmal (trat ein) ohne den fehlenden Konfigurationseintrag. Es gab keinen Hinweis auf das Problem mit der Konfiguration, ohne in diesen Code einzudringen. Du hast meine Woche gerettet, nachdem ich 2 Tage verschwendet hatte: P!
Pramod Sharma

1
@ MuhammadWaqasIqbal Dieser letzte fettgedruckte Satz ist der Schlüssel !!! JEDE Funktion, die ClientIDin diesem Beispiel verwendet wird, hat diesen Fehler. Guter Eintrag.
Vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. bedeutet, dass der statische Konstruktor für diese Klasse eine Ausnahme ausgelöst hat. Sie müssen also entweder im statischen Konstruktor der CSDetails-Klasse oder bei der Initialisierung aller statischen Mitglieder dieser Klasse nachsehen.


1
Sicher genug. Ich habe eine statische Instanz von log4net logger erstellt, die das Problem verursacht hat. Das Problem war, dass die Version der log4net-Assembly in diesem Projekt nicht mit der Version in den anderen Projekten übereinstimmte (worauf Shivan gerade ausdrücklich hingewiesen wurde)
goku_da_master

1
Ich hatte das gleiche Problem mit NLog. Ich neige dazu, meine Logger in statischen Konstruktoren zu initialisieren, und die Nichtübereinstimmung zwischen Versionen in verschiedenen Projekten hat das Problem verursacht. Die Verwendung der gleichen Version überall löste das Problem.
Shelbypereira

5

Ich hatte das gleiche Problem, als ich statische Methoden in einer Util-Klasse verwendete, genau wie Sie 'CSMessageUtility.CSDetails' verwendet hatten.

Das Problem bestand darin, dass das Framework während der statischen Initialisierung der Klasse (unter Verwendung des statischen Konstruktors) auch die statischen Variablen (Felder) in der Klasse initialisierte. Ich hatte eine statische Variable, die versucht, Werte aus app.config zu lesen, und in app.config fehlten die entsprechenden Einstellungen, was zu einer nicht behandelten Ausnahme führte. Dies führte dazu, dass die "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt wurde". als innere Ausnahme.


3

Eine andere Sache, die überprüft werden muss, wenn diese Initialisierungsfehler ausgelöst werden, besteht darin, zu überprüfen, ob die .NET-Zielversion auf dem Server installiert ist. Sie können mit der rechten Maustaste auf das Projekt klicken und sehen, auf welche .NET-Version die Anwendung abzielt.


3

Ich hatte das gleiche Problem, weil ich zwei der gleichen Konfigurationseigenschaften hatte (die mit der app.config übereinstimmen):

    [ConfigurationProperty("TransferTimeValidity")]

2

Ein anderes Szenario, das dies verursachen könnte, ist, wenn Sie einen Teil Ihres Codes haben, der Folgendes aufruft:

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

Beachten Sie, dass Sie die OWSTIMER.EXE.CONFIGDatei für die Einstellungen der Konfigurationsdatei verwenden müssen. Ich hatte eine App.configDatei, die ich lesen wollte, und ich bekam diesen Fehler, weil ich bei der Instanziierung meiner Jobinstanz eine Zeile in meinem Code hatte, die auf Connfiguration.AppSettings& verweist Configuration.ConnectionStrings. Stellen Sie einfach sicher, dass Sie den Weg gehen:

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

und platzieren Sie Ihre Konfigurationseinstellungen in der OWSTIMER.EXE.CONFIGDatei.


2

Dies kann passieren, wenn Sie eine Abhängigkeitseigenschaft haben, die für den falschen Besitzertyp registriert ist (Argument ownerType).

Beachten Sie, dass SomeOtherControl YourControl sein sollte.

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

Wenn aus irgendeinem Grund die Stromversorgung unterbrochen wird oder die Visual Studio-IDE abstürzt, kann dies zu einem Problem in Ihrem Bin / Debug-Bin / Release führen ...

Löschen Sie einfach den Inhalt und kompilieren Sie ihn neu (aus persönlicher Erfahrung, als mein Zeh den Reset-Knopf drückte!)


1

Ich hatte eine andere, aber immer noch verwandte Konfiguration.

Könnte ein benutzerdefinierter Konfigurationsabschnitt sein, der in configSections nicht deklariert wurde .

Deklarieren Sie einfach den Abschnitt und der Fehler sollte sich von selbst beheben.


1

Ich bin auf dieses Problem gestoßen, weil die Laufzeitversionen der Assemblys nicht übereinstimmen. Bitte überprüfen Sie die Laufzeitversionen der Hauptassembly (aufrufende Anwendung) und der angegebenen Assembly


1

Wie der Fehler besagt, ist die Initialisierung des Typs / der Klasse fehlgeschlagen. Dies tritt normalerweise auf, wenn im Konstruktor der Klasse eine Ausnahme vorliegt. Der häufigste Grund ist, dass Sie im Konstruktor einen Wert zuweisen, der aus einer Konfigurationsdatei liest, und in der Konfigurationsdatei fehlen diese Werte.


0

In meinem Fall war dies bei Logger.Create in einer Klassenbibliothek fehlgeschlagen, die von meiner Haupt- (Konsolen-) App verwendet wurde. Das Problem war, dass ich vergessen hatte, in meiner Konsolen-App einen Verweis auf NLog.dll hinzuzufügen. Das Hinzufügen der Referenz mit der richtigen Version der .NET Framework-Bibliothek hat das Problem behoben.


0

Hatte einen solchen Fall in einem WPF-Projekt. Mein Problem war in einer Zeile, die so lief:

DataTable myTable = FillTable(strMySqlQuery);

Wo FillTable() eine DataTable basierend auf einer SQL-Abfragezeichenfolge zurückgegeben wurde. Wenn ich die Option "Ausnahme in Zwischenablage kopieren" aktiviert und in Notepad eingefügt hätte, könnte ich die Nachricht sehen. Für mich war es The input is not a valid Base-64 string as it contains a non-base 64 character.

Mein eigentliches Problem war nicht, dass die Abfragezeichenfolge etwas hatte, das nicht vorhanden sein sollte, wie ich dachte, weil string strMySqlQuery = "SELECT * FROM My_Table"es meine Zeichenfolge war und dachte, es könnte das *oder sein _, aber das eigentliche Problem war FillTable(), wo ich einen Anruf bei einem anderen hatte Funktion, GetConnection()die ein OracleConnectionObjekt zurückgegeben hat, um es zu öffnen und die DataTable abzurufen und zurückzugeben. Im Inneren GetConnection()wurden die app.configParameter für meine Verbindungszeichenfolge abgerufen, und einer von ihnen wurde falsch benannt. Daher wurde ein Nullwert für das Kennwort des Dienstkontos festgelegt und keine DB-Verbindung hergestellt. Es ist also nicht immer so, dass der Fehler unter allen Umständen genau richtig ist. Tauchen Sie am besten in die Funktion ein, in der der Fehler auftritt, und debuggen Sie Schritt für Schritt, um sicherzustellen, dass alle Werte mit den erwarteten Werten gefüllt werden.


0

Auch ich war in zwei Situationen mit diesem Fehler konfrontiert

  1. Bei der Umleitung von der BAL-Schicht zur DAL-Schicht trat diese Ausnahme auf. Die innere Ausnahme besagt, dass "Objektreferenzfehler".

  2. Web.Config Dateischlüssel stimmt nicht überein.

Hoffe, dass dies nützlich ist, um Ihr Problem zu lösen.


0

Ähnlich wie Muhammad Iqbal angegeben .. Ich war in einem VB.NET - Projekt (auch C # sein) , wo ich ein Schlüssel-Wert - Paar aus dem entfernt habe , App.configdie durch eine Variable global auf die verwiesen wurde Sub Main()von Module Main. Daher tritt die Ausnahme (und Unterbrechung) Module Mainvor dem Sub Main(). Wenn ich nur einen Haltepunkt für das hätte Dim, aber wir brechen normalerweise nicht für globale Variablen. Vielleicht ein guter Grund, Globals, die auf App.config verweisen, nicht zu deklarieren? Mit anderen Worten, diese ...

In Unknown Module ist eine nicht behandelte Ausnahme vom Typ 'System.TypeInitializationException' aufgetreten. Der Typinitialisierer für 'Namespace.Main' hat eine Ausnahme ausgelöst.

Wurde ausgelöst durch...

App.config

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

Hauptmodul

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

    Sub Main()

        // main code

    End Main
End Module

0

In meinem Fall hatte ich eine Helferklasse, die statisch war. In dieser Klasse befand sich eine Methode zum Initialisieren eines von Variablen abhängigen SqlCommand. Da dies an mehreren Stellen aufgerufen wurde, habe ich es in die Hilfsklasse verschoben und nach Bedarf aufgerufen, sodass diese Methode auch statisch war. Jetzt hatte ich eine globale Eigenschaft, die die Verbindungszeichenfolge in Global.asax war und auf die Verbindungszeichenfolge in web.config zeigte. Zeitweise bekam ich "Der Typinitialisierer für 'Helper' hat eine Ausnahme ausgelöst". Wenn ich die Methode von der Helper-Klasse in die Klasse verschoben habe, in der sie von allen aufgerufen wurde, war das gut. Die innere Ausnahme beklagte sich darüber, dass das Objekt null ist (Hilfsklasse). Ich habe Using Helper zu Global.asax hinzugefügt, und obwohl es nicht von Global.asax verwendet wurde, hat dies das Problem gelöst.


0

Meine Antwort bezieht sich auch auf den Abschnitt Konfiguration. Wenn Sie Werte aus der Konfigurationsdatei in der statischen Klasse C # oder Module.VB von VB zuweisen, wird dieser Fehler zur Laufzeit angezeigt.

add key = "LogPath" value = "~ / Error_Log /"

Die Verwendung des Schrägstrichs in Web.Config führt auch zur Laufzeit zu diesem Fehler. Ich habe dieses Problem gerade durch BackSlash behoben

add key = "LogPath" value = "~ \ Error_Log \"


0

Ich wickelte meine abstürzende Zeile in einen Try-Catch-Block ein, druckte die Ausnahme aus und brach sofort nach dem Drucken ab. Die angezeigten Ausnahmeinformationen hatten eine Stapelverfolgung, die mich auf die Datei und die Codezeile hinwies, die den Fehler verursachten.

Geben Sie hier die Bildbeschreibung ein

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

Das Beenden von Visual Studio und das erneute Öffnen löste es irgendwie für mich.


0

Wörterbuchschlüssel sollten eindeutig sein!

In meinem Fall habe ich ein Wörterbuch verwendet und festgestellt, dass zwei Elemente versehentlich denselben Schlüssel haben.

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

0

Bemerkenswert: Ich hatte mehrere Projekte in meiner Lösung und habe vergessen, die Referenzen / Nuget-Bibliotheken hinzuzufügen. Als ich eine Methode in der statischen Klasse ausführte, die die angegebenen Bibliotheken verwendete, wurde die erwähnte Ausnahme ausgelöst.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.