L'initialiseur de type pour «MyClass» a levé une exception


217

Voici mon code de service Windows. Lorsque je débogue le code, j'obtiens l'erreur / exception:

L'initialiseur de type pour «CSMessageUtility.CSDetails» a levé 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();
                }
            }
        }
    }
}

5
Vérifiez l'initialisation des membres statiques.
Robino

Réponses:


350

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


4
merci Fredrik Mörk j'ai obtenu l'exception interne "La référence d'objet n'est pas définie sur une instance d'un objet." je vérifie
gofor.net

2
@ gofor.net: comme le souligne @Jackson Pope; la partie intéressante de votre code est la méthode static CSDetailsde la classe CSMessageUtility.CSDetails(et toutes les méthodes qu'elle peut appeler). Si vous ne trouvez pas le problème par vous-même, mettez à jour la question avec ce code.
Fredrik Mörk

en fait CSMessageUtility est la référence dll que j'utilise et qui contient les différentes méthodes. mais quand je vérifie ces méthodes manuellement, je n'ai pas eu d'erreur. cela fonctionne parfaitement
gofor.net

2
L'exception n'est pas toujours valide ou ne pointe pas vers le bon problème. Pour moi, il a essayé de me dire The input is not a valid Base-64 string as it contains a non-base 64 characterce qu'une fonction renvoyait à un objet DataTable, mais pour moi, il y avait en fait un problème sous-jacent où j'appelais un app.configparamètre avec le mauvais nom, donc une variable que j'utilisais pour former ma chaîne de connexion était nul. Par conséquent, il n'a pas pu ouvrir la OracleConnectionfonction in pour retourner le DataTable. Le meilleur conseil est de plonger dans la fonction sous-jacente qui renvoie l'erreur.
vapcguy

186

Ce problème peut être provoqué si une classe essaie d'obtenir la valeur d'une clé dans web.config ou app.config qui n'y est pas présente.

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 GoogleCalendarApplicationClientIDclé

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


24
Mec, je n'aurais jamais découvert ça par moi-même. Je comptais trop sur les points de rupture et, hélas, ils ne m'auraient pas sauvé. Merci mon pote! +1
Lukas

7
Je suis d'accord . . . Je viens juste de faire exactement la même chose. Tirait mes cheveux en essayant de le comprendre. Merci beaucoup!
dscarr

3
c'était une chaîne de connexion dans mon cas.
Musakkhir Sayyed

1
Vous rock homme! tu es un sauveur! Le projet référencé n'était même pas en train de déboguer (entrer) sans l'entrée de configuration manquante. Il n'y avait aucun indice pour se rapporter au problème avec la configuration sans pénétrer dans ce code. Vous avez sauvé ma semaine après avoir perdu 2 jours: P!
Pramod Sharma

1
@MuhammadWaqasIqbal Cette dernière phrase en gras est la clé !!! N'IMPORTE QUELLE fonction qui utilise ClientIDdans cet exemple aurait cette erreur. Très bonne publication.
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. signifie que le constructeur statique de cette classe a levé une exception - vous devez donc regarder soit dans le constructeur statique de la classe CSDetails, soit dans l'initialisation des membres statiques de cette classe.


1
Assez sur. Je créais une instance statique de l'enregistreur log4net à l'origine du problème. Le problème était que la version de l'assembly log4net dans ce projet ne correspondait pas à la version dans les autres projets (que je viens de remarquer que Shivan a spécifiquement souligné.)
goku_da_master

1
J'ai eu le même problème en utilisant NLog. J'ai tendance à initialiser mes enregistreurs dans des constructeurs statiques et le décalage entre les versions dans différents projets a causé le problème. l'utilisation de la même version partout a résolu le problème.
shelbypereira

5

J'ai rencontré le même problème, lorsque j'utilisais des méthodes statiques dans une classe Util, tout 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 framework initialisait également les variables statiques (champs) de la classe. J'avais une variable statique qui tente de lire les valeurs de app.config, et app.config manquait les paramètres respectifs, entraînant ainsi une exception non gérée. Cela a entraîné l'obtention de la «référence d'objet non définie sur une instance d'un objet». comme l'exception intérieure.


3

Une autre chose à vérifier lorsque ces erreurs d'initialisation sont levé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 .NET cible l'application.


3

J'ai eu le même problème dû au fait d'avoir deux des mêmes propriétés de configuration (qui correspondent à app.config):

    [ConfigurationProperty("TransferTimeValidity")]

2

Un autre scénario qui pourrait provoquer cela est lorsque vous avez un morceau de votre code qui appelle:

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

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

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

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


2

Cela peut se produire si vous avez une propriété de dépendance qui est enregistrée dans le mauvais type de propriétaire (argument ownerType).

Remarquez que 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));
}

1

Si, pour une raison quelconque, l'alimentation est coupée ou que l'IDE de Visual Studio se bloque, cela peut provoquer ce problème dans votre bin / debug bin / release ...

Il suffit de supprimer le contenu et de recompiler (à partir de mon expérience personnelle lorsque mon orteil a appuyé sur le bouton de réinitialisation!)


1

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

Il peut s'agir d'une section de configuration personnalisée qui n'a pas été déclarée dans configSections .

Déclarez simplement la section et l'erreur devrait se résoudre d'elle-même.


1

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érencé


1

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 dans la lecture du constructeur à partir d'un fichier de configuration et que le fichier de configuration ne contient pas ces valeurs.


0

Dans mon cas, j'ai eu cet échec sur Logger.Créez à l'intérieur d'une bibliothèque de classes qui était 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 de bibliothèque .NET Framework correcte a résolu le problème.


0

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

DataTable myTable = FillTable(strMySqlQuery);

FillTable()retourné un DataTable basé sur une chaîne de requête SQL. Si je faisais l'option "copier l'exception dans le presse-papiers", je pense que c'était le cas, et collée dans le Bloc-notes, je pouvais voir le message. Pour moi, ça l'é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 avait quelque chose qui ne devrait pas être là, comme je le pensais, parce que string strMySqlQuery = "SELECT * FROM My_Table"ma chaîne était et pensait que cela pourrait être le *ou _, mais le problème réel était FillTable()là, où j'avais un appel à un autre , GetConnection()qui a renvoyé un OracleConnectionobjet, afin de l'ouvrir et de récupérer et renvoyer le DataTable. À l'intérieur, GetConnection()j'obtenais les app.configparamètres de ma chaîne de connexion, et j'avais l'un d'eux mal nommé, donc il définissait une valeur nulle pour le mot de passe du compte de service et ne faisait pas la connexion DB. Ce n'est donc pas toujours là où l'erreur est exactement correcte dans toutes les circonstances. Il est préférable de plonger dans la fonction où se trouve l'erreur et de déboguer étape par étape et de vous assurer que toutes les valeurs sont remplies avec ce que vous attendez.


0

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

  1. Lors de la redirection de la couche BAL vers la couche DAL, j'ai fait face à cette exception. L'exception interne indique que "Erreur de référence d'objet".

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

J'espère que cela sera utile pour résoudre votre problème.


0

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

Une exception non gérée de type «System.TypeInitializationException» s'est produite dans le module inconnu. L'initialiseur de type pour 'Namespace.Main' a levé 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

Dans mon cas, j'avais une classe d'aide statique. Dans cette classe était une méthode pour initialiser un SqlCommand dépendant des variables. Comme cela était appelé à plusieurs endroits, je l'ai déplacé vers la classe d'assistance et appelé au besoin, donc cette méthode était également statique. Maintenant, j'avais une propriété globale qui était la chaîne de connexion dans Global.asax pointant vers la chaîne de connexion dans web.config. Par intermittence, j'obtenais "L'initialiseur de type pour 'Helper' a levé une exception". Si je déplaçais la méthode de la classe Helper vers la classe où elle était appelée de tous, c'était bien. L'exception interne se plaignait de la nullité de l'objet (classe Helper). Ce que j'ai fait a été d'ajouter Using Helper à Global.asax et même s'il n'était pas utilisé par Global.asax, cela a résolu le problème.


0

Ma réponse est également liée à la section Config. Si vous affectez des valeurs à partir du fichier de configuration à la classe statique de 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 lors de l'exécution. Je viens de résoudre ce problème en mettant BackSlash

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


0

J'ai enveloppé ma ligne qui plantait dans un bloc try-catch, j'ai imprimé l'exception et j'ai rompu immédiatement après son impression. Les informations d'exception affichées avaient une trace de pile qui m'a pointé vers le fichier et la ligne de code provoquant l'erreur.

entrez la description de l'image ici

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

Les clés du dictionnaire doivent être uniques!

Dans mon cas, j'utilisais un dictionnaire et j'ai trouvé deux éléments qui contenaient accidentellement la même clé.

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

0

À noter: j'avais plusieurs projets dans ma solution et j'ai oublié d'ajouter les références / bibliothèques Nuget. Lorsque j'ai exécuté une méthode dans la classe statique, qui utilisait les bibliothèques données, elle a levé l'exception mentionnée.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.