web-dev-qa-db-fra.com

L'initialiseur de type pour 'MyClass' a généré une exception

Ce qui suit est mon code de service Windows. Quand je débogue le code, j'obtiens l'erreur/exception:

Le type d'initialiseur pour 'CSMessageUtility.CSDetails' a renvoyé une exception.

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();
                }
            }
        }
    }
}
184
gofor.net

Vérifiez la propriété InnerException de la TypeInitializationException; il est susceptible de contenir des informations sur le problème sous-jacent et exactement où il s'est produit.

308
Fredrik Mörk

Ce problème peut être causé si une classe tente d'obtenir la valeur d'une clé dansweb.configouapp.configqui n'y est pas présent.

par exemple.
La classe a une variable statique 

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

Mais le web.config ne contient pas la clé GoogleCalendarApplicationClientID

L'erreur sera renvoyée sur tout appel de fonction statique ou toute création d'instance de classe

159

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. signifie que le constructeur statique de cette classe a émis une exception - vous devez donc rechercher dans le constructeur statique de la classe CSDetails ou dans l'initialisation de tout membre statique de cette classe.

53
Jackson Pope

J'ai rencontré le même problème lorsque j'utilisais des méthodes statiques dans une classe Util, exactement comme vous aviez utilisé 'CSMessageUtility.CSDetails'. 

Le problème était que lors de l'initialisation statique de la classe (à l'aide du constructeur statique), le cadre initialisait également les variables statiques (champs) de la classe. J'avais une variable statique qui essayait de lire les valeurs depuis app.config, et app.config manquait les paramètres respectifs, ce qui provoquait une exception non gérée. Cela a abouti à l'obtention de la "référence d'objet non définie à une instance d'objet". comme exception interne.

5
Tharaka

J'ai eu le même problème causé par deux propriétés de configuration identiques (qui correspond au fichier app.config):

    [ConfigurationProperty("TransferTimeValidity")]
3
Tim

Une autre chose à vérifier lorsque ces erreurs d’initialisation sont générées serait de vérifier si la version .NET cible est installée sur le serveur. Vous pouvez cliquer avec le bouton droit sur le projet et voir quelle version de .NET l'application est ciblée.

3
sharad shrestha

Cela peut arriver si une propriété de dépendance est enregistrée avec un type de propriétaire incorrect (argument ownerType).

Remarque SomeOtherControl aurait dû être 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));
}
2
Adam Caviness

Un autre scénario pouvant en être la cause est lorsque vous avez une partie de votre code qui appelle:

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

N'oubliez pas que vous devez utiliser le fichier OWSTIMER.EXE.CONFIG pour les paramètres du fichier de configuration. J'avais un fichier App.config que j'essayais de lire et j'obtenais cette erreur car lors de l'instanciation de mon instance de travail, une ligne dans mon code faisait référence à Connfiguration.AppSettings & Configuration.ConnectionStrings. Assurez-vous simplement que vous suivez le chemin: 

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

et placez vos paramètres de configuration dans le fichier OWSTIMER.EXE.CONFIG.

1
lionel jones

J'ai rencontré ce problème en raison d'une incompatibilité entre les versions d'exécution des assemblys. Veuillez vérifier les versions d'exécution de l'assembly principal (application appelante) et de l'assembly référé.

1
ShivanandSK

Si, pour une raison quelconque, le courant tombe en panne ou si Visual Studio IDE se bloque, cela peut entraîner ce problème dans votre bin/debug bin/release ...

Supprimez simplement le contenu et recompilez (à partir de mon expérience personnelle lorsque mon orteil a appuyé sur le bouton de réinitialisation!)

1
Dean

J'ai eu une configuration différente mais toujours liée.

Peut-être une section de configuration personnalisée qui n’a pas été déclarée dans configSections .

Il suffit de déclarer la section et l'erreur devrait se résoudre elle-même.

1
TylerBUrquhart

Moi aussi j'ai fait face à cette erreur dans deux situations 

  1. Lors de l'exécution de la redirection d'une couche BAL vers une couche DAL, j'ai rencontré cette exception. L'exception interne dit que "l'erreur de référence d'objet".

  2. La clé de fichier Web.Config ne correspond pas.

J'espère que cela vous aidera à résoudre votre problème.

0
Gopi P

Ma réponse est également liée à la section Config. Si vous affectez des valeurs à partir d'un fichier de configuration à la classe statique C # ou Module.VB de VB, vous obtiendrez cette erreur au moment de l'exécution.

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

L'utilisation de la barre oblique dans Web.Config entraîne également cette erreur au moment de l'exécution. Je viens de résoudre ce problème en mettant BackSlash

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

0
Mohamed Riyas

Avait un cas comme celui-ci dans un projet WPF. Mon problème était sur une ligne qui allait comme ceci:

DataTable myTable = FillTable(strMySqlQuery);

FillTable() a renvoyé un DataTable basé sur une chaîne de requête SQL. Si je faisais l'option "copier l'exception dans le presse-papier", je pense que c'était et collée dans le Bloc-notes, je pourrais voir le message. Pour moi, c'était The input is not a valid Base-64 string as it contains a non-base 64 character

Mon problème réel n'était pas que la chaîne de requête contenait quelque chose qui ne devrait pas être là, comme je le pensais, parce que string strMySqlQuery = "SELECT * FROM My_Table" était ma chaîne et pensait que ce pourrait être le * ou le _, mais le problème réel était dans FillTable(), où j'avais un appel à une autre fonction, GetConnection(), qui a renvoyé un objet OracleConnection, afin de l'ouvrir, ainsi que de récupérer et de renvoyer le DataTable. Inside GetConnection() Je recevais les paramètres app.config pour ma chaîne de connexion, et l'un d'entre eux était mal nommé. Il s'agissait donc de définir une valeur null pour le mot de passe du compte de service et de ne pas établir la connexion à la base de données. Ainsi, l'erreur n'est pas toujours correcte dans toutes les circonstances. Il est préférable de plonger dans la fonction où l'erreur se produit, de déboguer étape par étape et de s'assurer que toutes les valeurs sont remplies avec ce que vous attendez.

0
vapcguy

Dans mon cas, cette erreur échouait sur Logger.Create dans une bibliothèque de classes utilisée par mon application principale (console). Le problème était que j'avais oublié d'ajouter une référence à NLog.dll dans mon application console. L'ajout de la référence avec la version correcte de la bibliothèque .NET Framework a résolu le problème.

0
live-love

Semblable à ce que Muhammad Iqbal a déclaré. J'étais dans un projet VB.NET (peut aussi être en C #) où j'ai supprimé une paire clé-valeur du App.config qui était référencée par une variable globale à la Sub Main() de Module Main. Par conséquent, l'exception (et la rupture) se produisent dans Module Main avant la Sub Main(). Si seulement j'avais un point d'arrêt sur la Dim, mais nous n'interrompons généralement pas les variables globales. Peut-être une bonne raison de ne pas déclarer les globaux référençant App.config? En d'autres termes, cela ...

Une exception non gérée du type 'System.TypeInitializationException' s'est produite dans Unknown Module . L'initialiseur de type pour 'Namespace.Main' a généré une exception.

Est causé par...

App.config

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

Module principal

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

    Sub Main()

        // main code

    End Main
End Module
0
Adam Cox

Dans mon cas, j'avais une classe d'assistance statique. Dans cette classe se trouvait une méthode pour initialiser un SqlCommand dépendant de variables. Comme cela a été appelé à plusieurs endroits, je l'ai déplacé vers la classe helper et appelé si nécessaire. Cette méthode était donc également statique. J'avais maintenant une propriété globale qui était la chaîne de connexion dans Global.asax pointant vers la chaîne de connexion dans web.config. J'obtenais de temps en temps "L'initialiseur de type pour 'Helper' a lancé une exception". Si je déplaçais la méthode de la classe Helper vers la classe où elle était appelée, tout irait bien. L'exception interne s'est plaint de la nullité de l'objet (classe Helper). Ce que j'ai fait a été d'ajouter Using Helper à Global.asax et, même si Global.asax ne l'utilisait pas, le problème était résolu.

0
Ray

J'ai enroulé ma ligne qui se bloquait dans un bloc try-catch, imprimé l'exception et rompu immédiatement après son impression. L'information d'exception montrée avait une trace de pile qui me dirigeait vers le fichier et la ligne de code à l'origine de l'erreur.

 enter image description here

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
user3070485

Comme le dit l'erreur, l'initialisation du type/classe a échoué. Cela se produit généralement lorsqu'il existe une exception dans le constructeur de la classe. La raison la plus courante est que vous attribuez une valeur au constructeur qui lit un fichier de configuration et que le fichier de configuration manque de ces valeurs.

0
zak

En quelque sorte, quitter Visual Studio et le ré-ouvrir a résolu le problème pour moi.

0
Kirsten Greed