Das Folgende ist mein Windows-Dienstcode. Wenn ich den Code debugge, erhalte ich den Fehler / die Ausnahme:
Der Typinitialisierer für 'CSMessageUtility.CSDetails' hat eine Ausnahme ausgelöst.
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();
}
}
}
}
}
c#
windows-services
gofor.net
quelle
quelle
Antworten:
Überprüfen Sie die
InnerException
Eigenschaft desTypeInitializationException
; Es enthält wahrscheinlich Informationen über das zugrunde liegende Problem und genau den Ort, an dem es aufgetreten ist.quelle
static CSDetails
in der KlasseCSMessageUtility.CSDetails
(und alle Methoden, die sie aufruft). Wenn Sie das Problem nicht selbst finden, aktualisieren Sie die Frage mit diesem Code.The input is not a valid Base-64 string as it contains a non-base 64 character
wofür eine Funktion zu einem DataTable-Objekt zurückkehrt, aber für mich gab es tatsächlich ein zugrunde liegendes Problem, bei dem ich einenapp.config
Parameter mit dem falschen Namen aufrief, also eine Variable, mit der ich meinen Verbindungsstring bildete war null. Daher konnte dieOracleConnection
Funktion in dieser Funktion nicht geöffnet werden, um die Datentabelle zurückzugeben. Der beste Rat ist, in die zugrunde liegende Funktion einzutauchen, die den Fehler zurückgibt.Dieses Problem kann verursacht werden, wenn eine Klasse versucht, den Wert eines Schlüssels in web.config oder app.config abzurufen, der dort nicht vorhanden ist.
zB
Die Klasse hat eine statische Variable
Die web.config enthält jedoch keinen
GoogleCalendarApplicationClientID
SchlüsselDer Fehler wird bei jedem statischen Funktionsaufruf oder jeder Klasseninstanzerstellung ausgelöst
quelle
ClientID
in diesem Beispiel verwendet wird, hat diesen Fehler. Guter Eintrag.The type initializer for 'CSMessageUtility.CSDetails' threw an exception.
bedeutet, dass der statische Konstruktor für diese Klasse eine Ausnahme ausgelöst hat. Sie müssen also entweder im statischen Konstruktor der CSDetails-Klasse oder bei der Initialisierung aller statischen Mitglieder dieser Klasse nachsehen.quelle
Ich hatte das gleiche Problem, als ich statische Methoden in einer Util-Klasse verwendete, genau wie Sie 'CSMessageUtility.CSDetails' verwendet hatten.
Das Problem bestand darin, dass das Framework während der statischen Initialisierung der Klasse (unter Verwendung des statischen Konstruktors) auch die statischen Variablen (Felder) in der Klasse initialisierte. Ich hatte eine statische Variable, die versucht, Werte aus app.config zu lesen, und in app.config fehlten die entsprechenden Einstellungen, was zu einer nicht behandelten Ausnahme führte. Dies führte dazu, dass die "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt wurde". als innere Ausnahme.
quelle
Eine andere Sache, die überprüft werden muss, wenn diese Initialisierungsfehler ausgelöst werden, besteht darin, zu überprüfen, ob die .NET-Zielversion auf dem Server installiert ist. Sie können mit der rechten Maustaste auf das Projekt klicken und sehen, auf welche .NET-Version die Anwendung abzielt.
quelle
Ich hatte das gleiche Problem, weil ich zwei der gleichen Konfigurationseigenschaften hatte (die mit der app.config übereinstimmen):
quelle
Ein anderes Szenario, das dies verursachen könnte, ist, wenn Sie einen Teil Ihres Codes haben, der Folgendes aufruft:
Beachten Sie, dass Sie die
OWSTIMER.EXE.CONFIG
Datei für die Einstellungen der Konfigurationsdatei verwenden müssen. Ich hatte eineApp.config
Datei, die ich lesen wollte, und ich bekam diesen Fehler, weil ich bei der Instanziierung meiner Jobinstanz eine Zeile in meinem Code hatte, die aufConnfiguration.AppSettings
& verweistConfiguration.ConnectionStrings
. Stellen Sie einfach sicher, dass Sie den Weg gehen:und platzieren Sie Ihre Konfigurationseinstellungen in der
OWSTIMER.EXE.CONFIG
Datei.quelle
Dies kann passieren, wenn Sie eine Abhängigkeitseigenschaft haben, die für den falschen Besitzertyp registriert ist (Argument ownerType).
Beachten Sie, dass SomeOtherControl YourControl sein sollte.
quelle
Wenn aus irgendeinem Grund die Stromversorgung unterbrochen wird oder die Visual Studio-IDE abstürzt, kann dies zu einem Problem in Ihrem Bin / Debug-Bin / Release führen ...
Löschen Sie einfach den Inhalt und kompilieren Sie ihn neu (aus persönlicher Erfahrung, als mein Zeh den Reset-Knopf drückte!)
quelle
Ich hatte eine andere, aber immer noch verwandte Konfiguration.
Könnte ein benutzerdefinierter Konfigurationsabschnitt sein, der in configSections nicht deklariert wurde .
Deklarieren Sie einfach den Abschnitt und der Fehler sollte sich von selbst beheben.
quelle
Ich bin auf dieses Problem gestoßen, weil die Laufzeitversionen der Assemblys nicht übereinstimmen. Bitte überprüfen Sie die Laufzeitversionen der Hauptassembly (aufrufende Anwendung) und der angegebenen Assembly
quelle
Wie der Fehler besagt, ist die Initialisierung des Typs / der Klasse fehlgeschlagen. Dies tritt normalerweise auf, wenn im Konstruktor der Klasse eine Ausnahme vorliegt. Der häufigste Grund ist, dass Sie im Konstruktor einen Wert zuweisen, der aus einer Konfigurationsdatei liest, und in der Konfigurationsdatei fehlen diese Werte.
quelle
In meinem Fall war dies bei Logger.Create in einer Klassenbibliothek fehlgeschlagen, die von meiner Haupt- (Konsolen-) App verwendet wurde. Das Problem war, dass ich vergessen hatte, in meiner Konsolen-App einen Verweis auf NLog.dll hinzuzufügen. Das Hinzufügen der Referenz mit der richtigen Version der .NET Framework-Bibliothek hat das Problem behoben.
quelle
Hatte einen solchen Fall in einem WPF-Projekt. Mein Problem war in einer Zeile, die so lief:
Wo
FillTable()
eine DataTable basierend auf einer SQL-Abfragezeichenfolge zurückgegeben wurde. Wenn ich die Option "Ausnahme in Zwischenablage kopieren" aktiviert und in Notepad eingefügt hätte, könnte ich die Nachricht sehen. Für mich war esThe input is not a valid Base-64 string as it contains a non-base 64 character
.Mein eigentliches Problem war nicht, dass die Abfragezeichenfolge etwas hatte, das nicht vorhanden sein sollte, wie ich dachte, weil
string strMySqlQuery = "SELECT * FROM My_Table"
es meine Zeichenfolge war und dachte, es könnte das*
oder sein_
, aber das eigentliche Problem warFillTable()
, wo ich einen Anruf bei einem anderen hatte Funktion,GetConnection()
die einOracleConnection
Objekt zurückgegeben hat, um es zu öffnen und die DataTable abzurufen und zurückzugeben. Im InnerenGetConnection()
wurden dieapp.config
Parameter für meine Verbindungszeichenfolge abgerufen, und einer von ihnen wurde falsch benannt. Daher wurde ein Nullwert für das Kennwort des Dienstkontos festgelegt und keine DB-Verbindung hergestellt. Es ist also nicht immer so, dass der Fehler unter allen Umständen genau richtig ist. Tauchen Sie am besten in die Funktion ein, in der der Fehler auftritt, und debuggen Sie Schritt für Schritt, um sicherzustellen, dass alle Werte mit den erwarteten Werten gefüllt werden.quelle
Auch ich war in zwei Situationen mit diesem Fehler konfrontiert
Bei der Umleitung von der BAL-Schicht zur DAL-Schicht trat diese Ausnahme auf. Die innere Ausnahme besagt, dass "Objektreferenzfehler".
Web.Config
Dateischlüssel stimmt nicht überein.Hoffe, dass dies nützlich ist, um Ihr Problem zu lösen.
quelle
Ähnlich wie Muhammad Iqbal angegeben .. Ich war in einem VB.NET - Projekt (auch C # sein) , wo ich ein Schlüssel-Wert - Paar aus dem entfernt habe ,
App.config
die durch eine Variable global auf die verwiesen wurdeSub Main()
vonModule Main
. Daher tritt die Ausnahme (und Unterbrechung)Module Main
vor demSub Main()
. Wenn ich nur einen Haltepunkt für das hätteDim
, aber wir brechen normalerweise nicht für globale Variablen. Vielleicht ein guter Grund, Globals, die auf App.config verweisen, nicht zu deklarieren? Mit anderen Worten, diese ...Wurde ausgelöst durch...
App.config
Hauptmodul
quelle
In meinem Fall hatte ich eine Helferklasse, die statisch war. In dieser Klasse befand sich eine Methode zum Initialisieren eines von Variablen abhängigen SqlCommand. Da dies an mehreren Stellen aufgerufen wurde, habe ich es in die Hilfsklasse verschoben und nach Bedarf aufgerufen, sodass diese Methode auch statisch war. Jetzt hatte ich eine globale Eigenschaft, die die Verbindungszeichenfolge in Global.asax war und auf die Verbindungszeichenfolge in web.config zeigte. Zeitweise bekam ich "Der Typinitialisierer für 'Helper' hat eine Ausnahme ausgelöst". Wenn ich die Methode von der Helper-Klasse in die Klasse verschoben habe, in der sie von allen aufgerufen wurde, war das gut. Die innere Ausnahme beklagte sich darüber, dass das Objekt null ist (Hilfsklasse). Ich habe Using Helper zu Global.asax hinzugefügt, und obwohl es nicht von Global.asax verwendet wurde, hat dies das Problem gelöst.
quelle
Meine Antwort bezieht sich auch auf den Abschnitt Konfiguration. Wenn Sie Werte aus der Konfigurationsdatei in der statischen Klasse C # oder Module.VB von VB zuweisen, wird dieser Fehler zur Laufzeit angezeigt.
add key = "LogPath" value = "~ / Error_Log /"
Die Verwendung des Schrägstrichs in Web.Config führt auch zur Laufzeit zu diesem Fehler. Ich habe dieses Problem gerade durch BackSlash behoben
add key = "LogPath" value = "~ \ Error_Log \"
quelle
Ich wickelte meine abstürzende Zeile in einen Try-Catch-Block ein, druckte die Ausnahme aus und brach sofort nach dem Drucken ab. Die angezeigten Ausnahmeinformationen hatten eine Stapelverfolgung, die mich auf die Datei und die Codezeile hinwies, die den Fehler verursachten.
quelle
Das Beenden von Visual Studio und das erneute Öffnen löste es irgendwie für mich.
quelle
Wörterbuchschlüssel sollten eindeutig sein!
In meinem Fall habe ich ein Wörterbuch verwendet und festgestellt, dass zwei Elemente versehentlich denselben Schlüssel haben.
quelle
Bemerkenswert: Ich hatte mehrere Projekte in meiner Lösung und habe vergessen, die Referenzen / Nuget-Bibliotheken hinzuzufügen. Als ich eine Methode in der statischen Klasse ausführte, die die angegebenen Bibliotheken verwendete, wurde die erwähnte Ausnahme ausgelöst.
quelle