'MyClass'의 유형 초기화 프로그램에서 예외가 발생했습니다.


218

다음은 내 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();
                }
            }
        }
    }
}

5
정적 멤버의 초기화를 확인하십시오.
Robino

답변:


351

; 의 InnerException속성을 확인하십시오 TypeInitializationException. 근본적인 문제에 대한 정보와 문제가 발생한 위치를 포함하고있을 것입니다.


4
덕분에 Fredrik Mörk에 "객체 참조가 객체의 인스턴스로 설정되지 않았습니다"라는 내부 예외가 발생했습니다. 나는 그것을 확인하고
gofor.net

2
@ gofor.net : @ 잭슨 포프가 지적한대로; 코드에서 흥미로운 부분은 static CSDetails클래스 의 메소드 CSMessageUtility.CSDetails(및 호출 가능한 메소드)입니다. 스스로 문제를 찾지 못하면 해당 코드로 질문을 업데이트하십시오.
Fredrik Mörk

실제로 CSMessageUtility는 사용중인 dll 참조이며 여기에는 여러 가지 방법이 포함되어 있습니다. 하지만 내가 직접 그 방법을 확인할 때 나는 완벽하게 모든 error.it 작동을하지 않았다
gofor.net

2
예외가 항상 유효하거나 올바른 문제를 가리키는 것은 아닙니다. 나를 위해, 그것은 The input is not a valid Base-64 string as it contains a non-base 64 character함수가 DataTable 객체로 무엇을 반환하는지 말해 주려고했지만 실제로 app.config잘못된 이름으로 매개 변수를 호출하는 근본적인 문제가 있었 으므로 연결 문자열을 형성하는 데 사용하는 변수 널이었다. 따라서 OracleConnectionDataTable을 반환하기 위해 해당 함수를 열 수 없습니다 . 가장 좋은 조언은 오류를 반환하는 기본 함수로 다이빙하는 것입니다.
vapcguy

186

이 문제는 클래스가 존재하지 않는 web.config 또는 app.config 에서 키 값을 얻으려고 할 때 발생할 수 있습니다 .

예 :
클래스에는 정적 변수가 있습니다

private static string ClientID = System.Configuration.ConfigurationSettings.AppSettings["GoogleCalendarApplicationClientID"].ToString();

하지만 web.config 에는 GoogleCalendarApplicationClientID키 가 없습니다.

정적 함수 호출 또는 클래스 인스턴스 생성시 오류가 발생합니다.


24
나는 내 자신을 결코 찾지 못했을 것입니다. 나는 포인트 브레이크에 너무 많이 의존했고, 아쉽게도 그들은 나를 구하지 않았을 것이다. 고마워요! +1
Lukas

7
나는 동의한다 . . . 방금 똑같은 일이 일어났습니다. 그것을 알아 내려고 노력하면서 머리카락을 뽑아 내고있었습니다. 많은 감사합니다!
dscarr

3
내 경우에는 연결 문자열이었습니다.
Musakkhir Sayyed

1
당신은 락맨! 당신은 구세주입니다! 참조 된 프로젝트는 구성 항목이 누락되지 않고 디버깅조차하지 못했습니다. 해당 코드에 얽매이지 않고 config 문제에 관한 단서가 없었습니다. 당신은 내가 이틀을 낭비한 후 내 주를 저장 : P!
Pramod Sharma 2016

1
@MuhammadWaqasIqbal 마지막 대담한 문장이 열쇠입니다! ClientID이 예제에서 사용하는 모든 함수 에는이 오류가 발생합니다. 좋은 포스트.
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. 즉, 해당 클래스의 정적 생성자가 예외를 발생 시켰으므로 CSDetails 클래스의 정적 생성자 또는 해당 클래스의 정적 멤버 초기화에서 확인해야합니다.


1
충분합니다. 문제를 일으킨 log4net 로거의 정적 인스턴스를 작성 중이었습니다. 문제는 조립 다른 프로젝트의 버전과 일치하지 않았다 프로젝트에서 log4net의 버전이었다 (난 그냥 주목 shivan 구체적으로 지적했다.)
goku_da_master

1
NLog를 사용하여 동일한 문제가 발생했습니다. 정적 생성자에서 로거를 초기화하는 경향이 있으며 다른 프로젝트의 버전 간 불일치로 인해 문제가 발생했습니다. 모든 곳에서 동일한 버전을 사용하여 문제를 해결했습니다.
shelbypereira

5

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

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


3

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


3

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

    [ConfigurationProperty("TransferTimeValidity")]

2

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

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


2

잘못된 소유자 유형 (ownerType 인수)에 등록 된 종속성 속성이있는 경우 발생할 수 있습니다.

공지 사항 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));
}

1

어떤 이유로 전원이 꺼 지거나 Visual Studio IDE가 충돌하면 bin / debug bin / release 내부 에서이 문제가 발생할 수 있습니다 ...

내용을 삭제하고 다시 컴파일하십시오 (발가락이 재설정 버튼을 눌렀을 때 개인적인 경험에서!)


1

나는 다르지만 여전히 관련된 구성을 가졌습니다.

configSections 에서 선언되지 않은 사용자 정의 구성 섹션 일 수 있습니다. .

섹션을 선언하면 오류가 자체적으로 해결됩니다.


1

런타임 버전의 어셈블리가 일치하지 않아서이 문제가 발생했습니다. 주 어셈블리 (호출 응용 프로그램) 및 참조 된 어셈블리의 런타임 버전을 확인하십시오.


1

오류에 따르면 유형 / 클래스 초기화에 실패했습니다. 이것은 보통 클래스 생성자에 예외가있을 때 발생합니다. 가장 일반적인 이유는 구성 파일에서 읽는 구성자에 값을 할당하고 구성 파일에 해당 값이 누락 되었기 때문입니다.


0

내 경우에는 Logger 에서이 오류가 발생했습니다. 주 (콘솔) 앱에서 사용하고있는 클래스 라이브러리 내부에서 작성하십시오. 문제는 내 콘솔 앱에서 NLog.dll에 대한 참조를 추가하는 것을 잊어 버렸습니다. 올바른 .NET Framework 라이브러리 버전으로 참조를 추가하면 문제가 해결되었습니다.


0

WPF 프로젝트에서 이와 같은 경우가있었습니다. 내 문제는 다음과 같이 진행되었습니다.

DataTable myTable = FillTable(strMySqlQuery);

어디는 FillTable()SQL 쿼리 문자열을 기반으로 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을 검색하고 반환하기 위해 객체 GetConnection()를 반환하는 함수 OracleConnection입니다. 내부에서 연결 문자열에 대한 매개 변수를 GetConnection()얻었 app.config으며 그 중 하나의 이름이 잘못되어 서비스 계정 암호에 null 값을 설정하고 DB 연결을 설정하지 않았습니다. 따라서 모든 상황에서 오류가 항상 정확한 것은 아닙니다. 오류가 발생한 기능을 단계별로 디버그하고 모든 값이 예상 한 값으로 채워지는 것이 가장 좋습니다.


0

나는 두 가지 상황 에서이 오류에 직면했다.

  1. BAL 레이어에서 DAL 레이어로 리디렉션을 수행하는 동안이 예외에 직면했습니다. 내부 예외에 "객체 참조 오류"가 표시됩니다.

  2. Web.Config 파일 키가 일치하지 않습니다.

이것이 문제를 해결하는 데 도움이되기를 바랍니다.


0

무하마드 이크발가 언급 한 것과 마찬가지로 .. 내가 VB.NET에 있었다 나는에서 키 - 값 쌍을 제거 않았다 프로젝트 (또한 C #을 수 있음) App.config받는 변수 글로벌에 의해 참조 된 Sub Main()Module Main. 따라서. 이전에 예외 (및 중단)가 발생 Module Main합니다 Sub 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

0

제 경우에는 정적 인 도우미 클래스가있었습니다. 이 클래스에는 변수에 따라 SqlCommand를 초기화하는 방법이있었습니다. 이것이 여러 곳에서 호출되면서 도우미 클래스로 옮기고 필요에 따라 호출 했으므로이 방법도 정적이었습니다. 이제 Global.asax의 연결 문자열이 web.config의 연결 문자열을 가리키는 전역 속성이 있습니다. 간헐적으로 " 'Helper'에 대한 형식 이니셜 라이저에서 예외가 발생했습니다."가 표시됩니다. 메서드를 Helper 클래스에서 호출 된 클래스로 이동하면 좋았습니다. 내부 예외로 인해 개체가 null (헬퍼 클래스)이라고 불평했습니다. 내가 한 것은 Global.asax에 도우미 사용을 추가하는 것이 었으며 Global.asax에서 사용하지 않았지만이 문제를 해결했습니다.


0

내 답변은 구성 섹션과 관련이 있습니다. C #의 정적 클래스 또는 VB의 Module.VB에있는 구성 파일의 값을 할당하면 런타임시이 오류가 발생합니다.

key = "LogPath"value = "~ / Error_Log /"추가

Web.Config에서 슬래시를 사용하면 런타임시이 오류가 발생합니다. 방금 BackSlash를 넣어서이 문제를 해결했습니다.

key = "LogPath"value = "~ \ Error_Log \"추가


0

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.

0

어떻게 든 Visual Studio를 종료하고 다시 열면이 문제가 해결되었습니다.


0

사전 키는 고유해야합니다!

필자의 경우 사전을 사용하고 있었는데 실수로 동일한 키가있는 두 항목을 발견했습니다.

Dictionary<string, string> myDictionary = new Dictionary<string, string>() {
            {"KEY1", "V1"},
            {"KEY1", "V2" },
            {"KEY3", "V3"},
        };

0

주목할만한 점 : 솔루션에 여러 프로젝트가 있었고 참조 / Nuget 라이브러리를 추가하는 것을 잊었습니다. 주어진 라이브러리를 사용하는 정적 클래스에서 메소드를 실행할 때 언급 된 예외가 발생했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.