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();
}
}
}
}
}
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.
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
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.
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.
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")]
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.
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));
}
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
.
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é.
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!)
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.
Moi aussi j'ai fait face à cette erreur dans deux situations
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".
La clé de fichier Web.Config
ne correspond pas.
J'espère que cela vous aidera à résoudre votre problème.
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 \"
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);
Où 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.
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.
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
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.
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.
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.
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.
En quelque sorte, quitter Visual Studio et le ré-ouvrir a résolu le problème pour moi.