2010-05-20 3 views
0

일부 변수가 전체 응용 프로그램에서 사용하도록 선언 된 아래 클래스 파일을 사용하고 있습니다. 이제 변수 값 BlockLogOut을 다른 클래스 파일에 사용하여 값을 true로 설정했습니다.Error : Daemon.Global의 Type Initializer가 C#에서 예외를 던졌습니다.

난 그냥 .. 라인과 거기에 점점 오류 아래에이를 넣어 TypeInitializationException

Global.BlockLogOut = TRUE;

이상한 일은 여러 달 동안 잘 작동하고 있으며 위의 줄에이 오류가 표시됩니다. 물론 응용 프로그램에서 다른 것들을 수정하고 있었지만 확실히이 클래스 파일은 수정하지 않았습니다. 무엇이 문제 였을까요?

는 내부 예외 : 클래스 초기화 의해 슬로우 예외 래퍼로 발생되는 예외 : system.null 기준 제외한 객체 참조는 객체

namespace Daemon 
    { 
     class Global 
     { 
      public static bool BlockLogOut = false; 
     } 
    } 
+2

설명서에 따르면 TypeInitializationException에는보다 유용한 정보가 들어있는 innerexception 속성이 있습니다. InnerException을 게시 할 수 있습니까? – luke

+1

게시하십시오 InnerException – anishMarokey

+0

내부 예외 : system.null 참조 예외, 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. – Anuya

답변

1

샘플 코드가 전체 클래스의 전체 코드가 아닌 것으로 가정합니다. null 참조 예외는 정적 생성자의 어딘가에 클래스 인스턴스를 사용하고 있음을 나타냅니다. 값 유형이고 클래스가 아니기 때문에 코드에 포함 된 GlobalLock 변수와 관련이 없습니다.

1

이 오류 TypeInitializationException의 인스턴스로 설정되지 . 이 클래스는 상속 될 수 없습니다.

+0

지금 올바르게 변수를 사용하고 있지 않습니까? – Anuya

+0

내부 예외 : 시스템.당신이 정적 글로벌()를 는 { 은} 그것은 늘 오류 내 지점의 – Anuya

0

당신은 정적 생성자가 있다고 생각합니다 :) 그렇다면 예외는 실제로 정적 생성자 내에서 발생합니다.

namespace Daemon 
{ 
    using System; 

    public class Global 
    { 
     public static bool BlockLogOut = false; 

     static Global() 
     { 
      throw new Exception(); 
     } 
    } 
} 

namespace ConsoleApplication 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      Daemon.Global.BlockLogOut = true; // TypeInitializationException 
     } 
    } 
} 
+0

의 인스턴스로 설정되지 않았습니다 : system.null 참조 예외, 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. – anishMarokey

+0

을 던져 , 문제가 자신의 정적 생성자 – Diadistis

+0

내부 예외 내부에 자리 잡고 사용하는 경우 null 참조 예외는, 객체 참조가 개체 – Anuya

0

최근에 대상 프레임 워크를 .NET 4.0으로 변경 했습니까? 이것은 로 인한 것일 수 있습니다. .NET 4.0 (Jon Skeet은 그의 블로그에 post을 가지고 있습니다.)에서 유형이 초기화됩니다.

간단히 말해 CLR에서 형식을 초기화하는 방법과시기에 대한 몇 가지 변경 사항이 있습니다. 여전히 규격에 부합하지만, lazier 패션에서 그렇게합니다. 다시 말하지만, 간단히 말해서 에 실제로 해당 필드가 필요하기 전까지는 필드를 초기화하지 않습니다. (이러한 변경 사항의 특성에 대해서는 너무 확신하지 못합니다).

BlockLogOut이 빈 Initialize() { } 방법으로 초기화되고 있는지 확인하십시오. 실제로는 초기화 메소드를 사용하는 메소드가 호출되기 전까지는 초기화되지 않습니다 (예, 생성자와 인스턴스 메소드에도 적용 가능합니다. 특정 필드를 사용하지 않는 한).

하지만 항상 그렇듯이 필요할 때까지 필드가 초기화되고이 초기화는 한 번만 수행됩니다.

관련 문제