[C#] ‘MyClass’의 유형 초기화 프로그램에서 예외가 발생했습니다.

다음은 내 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. 즉, 해당 클래스의 정적 생성자가 예외를 발생 시켰으므로 CSDetails 클래스의 정적 생성자 또는 해당 클래스의 정적 멤버 초기화에서 확인해야합니다.


답변

‘CSMessageUtility.CSDetails’를 사용한 것처럼 Util 클래스에서 정적 메서드를 사용할 때도 같은 문제가 발생했습니다.

문제는 정적 생성자를 사용하여 클래스의 정적 초기화 중에 프레임 워크가 클래스의 정적 변수 (필드)를 초기화한다는 것입니다. app.config에서 값을 읽으려고 시도하는 정적 변수가 있었고 app.config에 각 설정이 누락되어 처리되지 않은 예외가 발생했습니다. 결과적으로 “개체 참조가 개체의 인스턴스로 설정되지 않았습니다.”가 나타납니다. 내부 예외로.


답변

이러한 초기화 오류가 발생할 때 확인해야 할 또 다른 사항은 대상 .NET 버전이 서버에 설치되어 있는지 확인하는 것입니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 응용 프로그램이 대상으로하는 .NET 버전을 확인할 수 있습니다.


답변

app.config와 일치하는 두 개의 동일한 구성 속성을 사용하여 동일한 문제가 발생했습니다.

    [ConfigurationProperty("TransferTimeValidity")]


답변

이 문제를 일으킬 수있는 또 다른 시나리오는 다음과 같은 코드를 호출하는 경우입니다.

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파일 에 배치하십시오 .