L'inizializzatore del tipo per "MyClass" ha generato un'eccezione


217

Di seguito è riportato il mio codice di servizio di Windows. Quando eseguo il debug del codice, visualizzo l'errore / eccezione:

L'inizializzatore del tipo per "CSMessageUtility.CSDetails" ha generato un'eccezione.

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
Controllare l'inizializzazione dei membri statici.
Robino,

Risposte:


350

Controlla la InnerExceptionproprietà del TypeInitializationException; è probabile che contenga informazioni sul problema sottostante ed esattamente dove si è verificato.


4
grazie Fredrik Mörk ho ottenuto l'eccezione interna "Riferimento oggetto non impostato su un'istanza di un oggetto". lo sto verificando
gofor.net il

2
@ gofor.net: come sottolinea @Jackson Pope; la parte interessante del tuo codice è il metodo static CSDetailsnella classe CSMessageUtility.CSDetails(e tutti i metodi che può chiamare). Se non trovi il problema da solo, aggiorna la domanda con quel codice.
Fredrik Mörk,

in realtà CSMessageUtility è il riferimento dll che sto usando e questo contiene i vari metodi. ma quando controllo questi metodi manualmente non ho riscontrato alcun errore. Funziona perfettamente
gofor.net

2
L'eccezione non è sempre valida o indica il problema giusto. Per me, ha cercato di dirmi The input is not a valid Base-64 string as it contains a non-base 64 characterper quale funzione stava tornando a un oggetto DataTable, ma per me c'era effettivamente un problema di fondo in cui stavo chiamando un app.configparametro con il nome sbagliato, quindi una variabile che stavo usando per formare la mia stringa di connessione era nullo. Pertanto non è stato possibile aprire la OracleConnectionfunzione in per restituire la DataTable. Il miglior consiglio è di immergersi nella funzione sottostante che sta restituendo l'errore.
vapcguy,

186

Questo problema può essere causato se una classe tenta di ottenere il valore di una chiave in web.config o app.config che non è presente lì.

es.
La classe ha una variabile statica

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

Ma web.config non contiene la GoogleCalendarApplicationClientIDchiave

L'errore verrà generato su qualsiasi chiamata di funzione statica o creazione di un'istanza di classe


24
Amico, non l'avrei mai scoperto da solo. Facevo troppo affidamento sulle pause e, purtroppo, non mi avrebbero salvato. Grazie amico! +1
Lukas

7
Sono d'accordo . . . Ho appena fatto succedere esattamente la stessa cosa. Mi stava strappando i capelli cercando di capirlo. Grazie molto!
dscarr,

3
era una stringa di connessione nel mio caso.
Musakkhir Sayyed,

1
Uomo rock! sei un salvatore! Il progetto a cui si fa riferimento non era nemmeno debug (passaggio) senza la voce di configurazione mancante. Non c'era idea di collegarsi al problema con config senza entrare nel codice. Mi hai salvato la settimana dopo che ho perso 2 giorni: P!
Pramod Sharma,

1
@MuhammadWaqasIqbal L'ultima frase in grassetto è la chiave !!! QUALSIASI funzione che usa ClientIDin questo esempio avrebbe questo errore. Ottimo post.
vapcguy,

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. significa che il costruttore statico su quella classe ha generato un'eccezione, quindi è necessario cercare nel costruttore statico della classe CSDetails o nell'inizializzazione di tutti i membri statici di quella classe.


1
Abbastanza sicuro. Stavo creando un'istanza statica del logger log4net che stava causando il problema. Il problema era che la versione dell'assembly log4net in quel progetto non corrispondeva alla versione degli altri progetti (che ho appena notato shivan specificamente sottolineato).
goku_da_master

1
Ho avuto lo stesso problema con NLog. Tendo a inizializzare i miei logger in costruttori statici e il disadattamento tra le versioni in diversi progetti ha causato il problema. utilizzando la stessa versione ovunque risolto il problema.
shelbypereira,

5

Mi sono imbattuto nello stesso problema, quando stavo usando un metodo statico in una classe Util, proprio come avevi usato 'CSMessageUtility.CSDetails'.

Il problema era che durante l'inizializzazione statica della classe (usando il costruttore statico), il framework inizializzava anche le variabili statiche (campi) nella classe. Avevo una variabile statica che tentava di leggere i valori da app.config e app.config mancava le rispettive impostazioni, risultando in un'eccezione non gestita. Ciò ha comportato l'ottenimento del "Riferimento oggetto non impostato su un'istanza di un oggetto". come eccezione interiore.


3

Un'altra cosa da verificare quando vengono generati questi errori di inizializzazione sarebbe quella di verificare se la versione .NET di destinazione è installata sul server. È possibile fare clic con il pulsante destro del mouse sul progetto e vedere a quale versione .NET è rivolta l'applicazione.


3

Ho avuto lo stesso problema causato dall'avere due delle stesse proprietà di configurazione (che corrispondono a app.config):

    [ConfigurationProperty("TransferTimeValidity")]

2

Un altro scenario che potrebbe causare questo è quando hai un pezzo del tuo codice che chiama:

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

Tieni presente che devi utilizzare il OWSTIMER.EXE.CONFIGfile per le impostazioni del file di configurazione. Avevo un App.configfile che stavo cercando di leggere e stavo ottenendo questo errore perché all'istanza della mia istanza di lavoro, avevo una riga nel mio codice che si riferiva a Connfiguration.AppSettings& Configuration.ConnectionStrings. Assicurati solo di seguire il percorso:

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

e posizionare le impostazioni di configurazione nel OWSTIMER.EXE.CONFIGfile.


2

Questo può accadere se si dispone di una proprietà di dipendenza registrata con un tipo di proprietario errato (argomento ownerType).

Nota SomeOtherControl avrebbe dovuto essere 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

Se per qualsiasi motivo la corrente si interrompe o l'IDE di Visual Studio si arresta in modo anomalo può causare questo problema all'interno del bin / bin di debug / release ...

Basta eliminare il contenuto e ricompilare (per esperienza personale quando il dito del piede preme il pulsante di ripristino!)


1

Avevo una configurazione diversa ma ancora correlata.

Potrebbe essere una sezione di configurazione personalizzata che non è stata dichiarata in configSections .

Dichiarare semplicemente la sezione e l'errore dovrebbe risolversi automaticamente.


1

Ho riscontrato questo problema a causa della mancata corrispondenza tra le versioni di runtime degli assembly. Verificare le versioni di runtime dell'assembly principale (applicazione chiamante) e dell'assembly riferito


1

Come dice l'errore, l'inizializzazione del tipo / classe non è riuscita. Questo di solito si verifica quando c'è qualche eccezione nel costruttore della classe. La ragione più comune è che si assegna un valore nella lettura del costruttore da un file di configurazione e nel file di configurazione mancano quei valori.


0

Nel mio caso ho riscontrato questo errore su Logger.Create all'interno di una libreria di classi utilizzata dalla mia app principale (console). Il problema era che avevo dimenticato di aggiungere un riferimento a NLog.dll nella mia app console. L'aggiunta del riferimento con la versione corretta della libreria .NET Framework ha risolto il problema.


0

Ho avuto un caso del genere in un progetto WPF. Il mio problema era su una linea che è andata così:

DataTable myTable = FillTable(strMySqlQuery);

Dove ha FillTable()restituito una DataTable basata su una stringa di query SQL. Se avessi fatto l'opzione "copia eccezione negli Appunti", penso che fosse, e incollata nel Blocco note, avrei potuto vedere il messaggio. Per me lo eraThe input is not a valid Base-64 string as it contains a non-base 64 character .

Il mio vero problema non era che la stringa di query avesse qualcosa che non avrebbe dovuto essere lì, come stavo pensando, perché string strMySqlQuery = "SELECT * FROM My_Table"era la mia stringa e pensavo che potesse essere il *o _, ma il vero problema era in FillTable(), dove avevo una chiamata a un altro funzione, GetConnection()che ha restituito un OracleConnectionoggetto, al fine di aprirlo, recuperare e restituire la DataTable. All'interno GetConnection()stavo ottenendo i app.configparametri per la mia stringa di connessione e ne avevo uno sbagliato, quindi stavo impostando un valore nullo per la password dell'account del servizio e non facevo la connessione al DB. Quindi non è sempre dove l'errore è esattamente corretto per tutte le circostanze. Meglio immergersi nella funzione in cui si trova l'errore ed eseguire il debug passo dopo passo e assicurarsi che tutti i valori vengano riempiti con ciò che ci si aspetta.


0

Anch'io ho affrontato questo errore in due situazioni

  1. Durante l'esecuzione del reindirizzamento dal livello BAL al livello DAL ho riscontrato questa eccezione. Eccezione interna indica che "Errore riferimento oggetto".

  2. Web.Config la chiave del file non corrisponde.

Spero che questo sia utile per risolvere il tuo problema.


0

Simile a quanto affermato da Muhammad Iqbal. Ero in un progetto VB.NET (potrebbe anche essere C #) in cui ho rimosso una coppia chiave-valore dalla App.configquale faceva riferimento una variabile globale alla Sub Main()di Module Main. Pertanto, l'eccezione (e l'interruzione) si verifica Module Mainprima del Sub Main(). Se solo avessi un punto di rottura sulDim , ma di solito non interrompiamo le variabili globali. Forse un buon motivo per non dichiarare i globuli che fanno riferimento a App.config? In altre parole, questo ...

Si è verificata un'eccezione non gestita del tipo "System.TypeInitializationException" nel modulo sconosciuto. L'inizializzatore del tipo per "Namespace.Main" ha generato un'eccezione.

È causato da...

App.config

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

Modulo principale

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

    Sub Main()

        // main code

    End Main
End Module

0

Nel mio caso, avevo una classe di supporto statica. In quella classe c'era un metodo per inizializzare un comando Sql dipendente dalle variabili. Dato che questo veniva chiamato in diversi punti, l'ho spostato nella classe helper e chiamato come necessario, quindi anche questo metodo era statico. Ora avevo una proprietà globale che era la stringa di connessione in Global.asax che puntava alla stringa di connessione in web.config. A intermittenza avrei ricevuto "L'inizializzatore del tipo per 'Helper' ha generato un'eccezione". Se avessi spostato il metodo dalla classe Helper alla classe in cui veniva chiamato da tutti, sarebbe stato un bene. L'eccezione interna si è lamentata del fatto che l'oggetto è nullo (classe Helper). Quello che ho fatto è stato aggiungere Using Helper a Global.asax e anche se non è stato utilizzato da Global.asax questo ha risolto il problema.


0

La mia risposta è anche correlata alla sezione Config. Se si assegnano valori dal file di configurazione nella classe statica di C # o Module.VB di VB, si otterrà questo errore in fase di esecuzione.

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

L'uso della barra in avanti in Web.Config porta anche a questo errore in fase di esecuzione. Ho appena risolto questo problema inserendo BackSlash

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


0

Ho avvolto la mia linea che si stava schiantando in un blocco try-catch, ho stampato l'eccezione e ho rotto subito dopo la stampa. Le informazioni sull'eccezione mostrate avevano una traccia dello stack che mi indicava il file e la riga di codice causando l'errore.

inserisci qui la descrizione dell'immagine

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

In qualche modo uscire da Visual Studio e riaprirlo mi ha risolto questo problema.


0

Le chiavi del dizionario dovrebbero essere uniche!

Nel mio caso, stavo usando un dizionario e ho trovato due elementi che hanno accidentalmente la stessa chiave.

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

0

Degno di nota: avevo diversi progetti nella mia soluzione e ho dimenticato di aggiungere i riferimenti / librerie Nuget. Quando ho eseguito un metodo nella classe statica, che utilizzava le librerie fornite, ha generato l'eccezione menzionata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.