264 votes

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

Ce qui suit est mon code de service Windows, je reçois le "Le type initializer pour 'CSMessageUtility.CSDetails' a levé une exception." exception lorsque je débogue le code.

 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();
           }

       }
   }
}
 

}

Merci d'avance

408voto

Fredrik Mörk Points 85694

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

216voto

Waqas Iqbal Points 421

Ce problème peut être causé si une classe essaie d’obtenir la valeur d’une clé dans web.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 fichier web.config ne contient pas la clé "GoogleCalendarApplicationClientID"

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

66voto

Jackson Pope Points 9294

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. signifie que le constructeur statique de cette classe a généré 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.

10voto

Thara Points 450

J'ai rencontré le même problème, lorsque j'étais en utilisant l'une des méthodes statiques dans une classe Util, tout comme vous l'aviez 'CSMessageUtility.CSDetails'.

Le problème est que lors de l'initialisation statique de la classe (en utilisant le constructeur statique), le cadre également d'initialiser les variables statiques (champs) dans la classe. J'ai eu une variable statique qui tente de lire les valeurs à partir de l'app.config, et app.config manquait les paramètres respectifs, entraînant ainsi une exception non-traitée. Cela a abouti à l'obtention de la "la référence d'Objet n'est pas définie à une instance d'un objet." comme l'intérieur d'exception.

1voto

Dean Points 11

Juste une note rapide, au cas où cela arriverait à quelqu'un d'autre.

Si, pour une raison quelconque, le courant tombe ou que le conflit entre en cause, cela peut entraîner ce problème dans votre bin / debug bin / release .. supprimez simplement le contenu et recompilez. (de mon expérience personnelle quand mon orteil a appuyé sur le bouton de réinitialisation!)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X