以下は私のWindowsサービスコードです。コードをデバッグしているときに、エラー/例外が発生しています。
'CSMessageUtility.CSDetails'の型初期化子が例外をスローしました。
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();
}
}
}
}
}
InnerException
のTypeInitializationException
プロパティーを確認してください。根本的な問題についての情報、そしてそれが正確に発生した場所に関する情報が含まれている可能性があります。
この問題は、クラスがweb.configまたはapp.config存在しません。
例えば.
クラスは静的変数を持っています
private static string ClientID = System.Configuration.ConfigurationSettings.AppSettings["GoogleCalendarApplicationClientID"].ToString();
しかし、web.configにはGoogleCalendarApplicationClientID
キーが含まれていません
エラーは任意の静的関数呼び出しまたは任意のクラスインスタンス作成にスローされます。
The type initializer for 'CSMessageUtility.CSDetails' threw an exception.
は、そのクラスの静的コンストラクタがExceptionをスローしたことを意味します。したがって、CSDetailsクラスの静的コンストラクタ、またはそのクラスの静的メンバの初期化のいずれかを調べる必要があります。
あなたが 'CSMessageUtility.CSDetails'を使用したのと同じように、Utilクラスで静的メソッドを使用していたときにも同じ問題に遭遇しました。
問題は、クラスの静的初期化中(静的コンストラクターを使用)、フレームワークがクラス内の静的変数(フィールド)も初期化することでした。 app.configから値を読み込もうとする静的変数があり、app.configにそれぞれの設定がないため、未処理の例外が発生しました。その結果、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という結果になりました。内部例外として。
私は同じ設定プロパティを2つ持っていることによっても同じ問題を抱えていました(これはapp.configにマッチします):
[ConfigurationProperty("TransferTimeValidity")]
これらの初期化エラーが発生したときに確認するもう1つのことは、ターゲットの.NETバージョンがサーバーにインストールされているかどうかを確認することです。プロジェクトを右クリックして、アプリケーションがターゲットとしている.NETのバージョンを確認できます。
これは、間違った所有者タイプ(ownerType引数)に登録されている依存関係プロパティがある場合に発生する可能性があります。
Notice SomeOtherControlは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));
}
これを引き起こすかもしれないもう一つのシナリオはあなたがあなたのコードの一部を持っているときです:
string sParam = **ConfigurationManager.AppSettings["SOME_PARAM"].ToString();
設定ファイルの設定にはOWSTIMER.EXE.CONFIG
ファイルを使用する必要があることに注意してください。私が読み込もうとしているApp.config
ファイルがあり、このエラーが発生していました。ジョブインスタンスのインスタンス化時に、Connfiguration.AppSettings
およびConfiguration.ConnectionStrings
を参照している行がコードに含まれていたためです。あなたが道を行くことをちょうど確かめなさい:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN
構成設定をOWSTIMER.EXE.CONFIG
ファイルに配置します。
アセンブリのランタイムバージョン間の不一致が原因で、この問題が発生しました。メインアセンブリ(呼び出し側アプリケーション)および参照アセンブリのランタイムバージョンを確認してください。
なんらかの理由で電源が落ちたり、Visual Studio IDEがクラッシュしたりすると、bin/debug bin/releaseの中でこの問題が発生することがあります。
内容を削除して再コンパイルするだけです(つま先がリセットボタンを押したときの個人的な経験から)。
私は違うけれどもまだ関連した設定をしました。
configSectionsで宣言されていないカスタム構成セクションである可能性があります。
セクションを宣言するだけで、エラーは自動的に解決します。
私も2つの状況でこのエラーに直面しました
BALレイヤからDALレイヤへのリダイレクトを実行している間、私はこの例外に直面しました。内部例外は「オブジェクト参照エラー」と言っています。
Web.Config
ファイルキーが一致しません。
これがあなたの問題を解決するのに役立つことを願っています。
私の答えはConfigセクションにも関連しています。 C#の静的クラスまたはVBのModule.VBのConfigファイルから値を割り当てると、実行時にこのエラーが発生します。
add key = "LogPath" value = "〜/ Error_Log /"
Web.Configでスラッシュを使用すると、実行時にこのエラーが発生します。私はちょうどBackSlashを置くことによってこの問題を解決しました
add key = "LogPath" value = "〜\ Error_Log \"
WPFプロジェクトでこのようなケースがありました。私の問題は次のような行にありました。
DataTable myTable = FillTable(strMySqlQuery);
SQLクエリ文字列に基づいてFillTable()
がDataTableを返しました。 「例外をクリップボードにコピーする」オプションを実行した場合は、それが正しいと思い、メモ帳に貼り付けると、メッセージが表示されます。私にとってはThe input is not a valid Base-64 string as it contains a non-base 64 character
でした。
string strMySqlQuery = "SELECT * FROM My_Table"
は私の文字列で*
または_
であると考えていたので私の実際の問題は私が考えていたようにそこにあるべきではない何かがクエリ文字列にあったことではありませんでしたが、実際の問題はFillTable()
にありましたこれを開き、DataTableを取得して返すために、OracleConnection
オブジェクトを返すGetConnection()
という別の関数を呼び出しました。 Inside GetConnection()
接続文字列のapp.config
パラメータを取得していましたが、そのうちの1つに名前が間違っていたため、サービスアカウントのパスワードにnull値を設定してDB接続を確立していませんでした。そのため、エラーがすべての状況に対して正確に正しいとは限りません。エラーがある関数に飛び込み、段階的にデバッグして、すべての値が期待したもので満たされるようにすることをお勧めします。
私の場合は、メイン(コンソール)アプリケーションで使用されていたクラスライブラリ内でLogger.Createに失敗しました。問題は私が私のコンソールアプリでNLog.dllへの参照を追加するのを忘れていたということでした。 .NET Frameworkライブラリの正しいバージョンで参照を追加することで問題が解決しました。
Muhammad Iqbalが述べたのと同じように..私はApp.config
のSub Main()
に対して参照されていたModule Main
からキーと値のペアを削除したVB.NET(C#かもしれません)プロジェクトにいました。したがって、例外(およびブレーク)はSub Main()
の前のModule Main
で発生します。 Dim
にブレークポイントを設定しただけで、グローバル変数にブレークすることは通常ありません。 App.configを参照しているグローバルを宣言しないのが、おそらくもっともな理由でしょうか。言い換えれば、これ...
不明なモジュールで、タイプ 'System.TypeInitializationException'の未処理の例外が発生しました。 'Namespace.Main'の型初期化子が例外を投げました。
によって引き起こされます...
App.config
<connectionStrings>
<!--<add name="ConnectionString1" connectionString="..." />-->
メインモジュール
Module Main
Dim cnnString As String = ConfigurationManager.ConnectionStrings("ConnectionString1") '<-- BREAK HERE (EXCEPTION)
Sub Main()
// main code
End Main
End Module
私の場合は、静的なヘルパークラスがありました。そのクラスには、変数に依存するSqlCommandを初期化するメソッドがありました。これはいくつかの場所で呼び出されていたので、ヘルパークラスに移動して必要に応じて呼び出したので、このメソッドも静的でした。これで、web.configの接続文字列を指すGlobal.asaxの接続文字列であるグローバルプロパティができました。断続的に「Helperの型初期化子が例外を投げました」と表示されます。私がそのメソッドをHelperクラスからそれが呼ばれていたクラスに移動したならば、それは良かったです。内部例外がオブジェクトがnullであることを訴えました(Helperクラス)。私がしたことはGlobal.asaxにUsing Helperを追加することでした、そしてそれがGlobal.asaxによって使用されていなかったとしても、これは問題を解決しました。
クラッシュした行をtry-catchブロックで囲み、例外を出力し、印刷された直後に改行しました。表示された例外情報には、エラーを発生させる原因となったファイルとコード行を示すスタックトレースがありました。
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.
エラーが言うように、タイプ/クラスの初期化は失敗しました。これは通常、クラスのコンストラクターに何らかの例外がある場合に発生します。最も一般的な理由は、構成ファイルから読み取るコンストラクターに何らかの値を割り当て、構成ファイルにそれらの値が欠落していることです。
どういうわけかVisual Studioを終了して再度開くと、これが解決しました。