O inicializador de tipo para 'MyClass' lançou uma exceção

217

A seguir está o meu código de serviço do Windows. Quando estou depurando o código, estou recebendo o erro / exceção:

O inicializador de tipo para 'CSMessageUtility.CSDetails' lançou uma exceção.

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();
                }
            }
        }
    }
}
gofor.net
fonte
5
Verifique a inicialização dos membros estáticos.
Robino 31/03

Respostas:

350

Verifique a InnerExceptionpropriedade do TypeInitializationException; é provável que contenha informações sobre o problema subjacente e exatamente onde ocorreu.

Fredrik Mörk
fonte
4
obrigado Fredrik Mörk, recebi a exceção interna "Referência de objeto não definida para uma instância de um objeto". estou verificando
gofor.net
2
@ gofor.net: como @Jackson Pope aponta; a parte interessante do seu código é o método static CSDetailsna classe CSMessageUtility.CSDetails(e quaisquer métodos que ele possa chamar). Se você não encontrar o problema sozinho, atualize a pergunta com esse código.
Fredrik Mörk
realmente CSMessageUtility é dll referência que estou usando e isso contém os vários métodos. mas quando eu verifico esses métodos manualmente, não recebi nenhum error.it funciona perfeitamente
gofor.net
2
A exceção nem sempre é válida ou aponta para o problema certo. Para mim, ele tentou me dizer o The input is not a valid Base-64 string as it contains a non-base 64 characterque uma função estava retornando para um objeto DataTable, mas, para mim, havia um problema subjacente em que eu estava chamando um app.configparâmetro com o nome errado, portanto, uma variável que eu estava usando para formar minha string de conexão foi nulo. Portanto, não foi possível abrir a OracleConnectionfunção nessa para retornar o DataTable. O melhor conselho é mergulhar na função subjacente que está retornando o erro.
vapcguy
186

Esse problema pode ser causado se uma classe tentar obter o valor de uma chave no web.config ou app.config que não está presente lá.

por exemplo,
a classe tem uma variável estática

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

Mas o web.config não contém a GoogleCalendarApplicationClientIDchave

O erro será gerado em qualquer chamada de função estática ou em qualquer criação de instância de classe

Muhammad Waqas Iqbal
fonte
24
Cara, eu nunca descobriria isso sozinho. Eu estava confiando demais nas quebras de pontos e, infelizmente, elas não teriam me salvado. Obrigado amigo! +1
Lukas
7
Concordo . . . Acabei de fazer exatamente a mesma coisa. Estava puxando meu cabelo tentando descobrir. Muito Obrigado!
dscarr
3
era uma cadeia de conexão no meu caso.
Musakkhir Sayyed
1
Você é demais! você é um salvador! O projeto referenciado nem estava depurando (entrando) sem a entrada de configuração ausente. Não havia nenhuma pista para se relacionar com o problema com a configuração sem entrar nesse código. Você salvou minha semana depois que eu perdi 2 dias: P!
Pramod Sharma
1
@MuhammadWaqasIqbal Essa última frase em negrito é a chave !!! QUALQUER função que usa ClientIDneste exemplo teria esse erro. Ótimo post.
vapcguy
57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. significa que o construtor estático nessa classe lançou uma exceção - portanto, é necessário procurar no construtor estático da classe CSDetails ou na inicialização de qualquer membro estático dessa classe.

Jackson Pope
fonte
1
Com certeza. Eu estava criando uma instância estática do log4net logger que estava causando o problema. O problema era a versão do log4net montagem em que o projeto não coincide com a versão em outros projetos (que eu só shivan notado especificamente apontou.)
goku_da_master
1
Eu tive o mesmo problema usando o NLog. Costumo inicializar meus criadores de logs em construtores estáticos e a incompatibilidade entre versões em diferentes projetos causou o problema. usar a mesma versão em todos os lugares resolveu o problema.
Shelbypereira 25/10/16
5

Encontrei o mesmo problema quando estava usando métodos estáticos em uma classe Util, exatamente como você usou 'CSMessageUtility.CSDetails'.

O problema era que, durante a inicialização estática da classe (usando o construtor estático), a estrutura também inicializou as variáveis ​​estáticas (campos) na classe. Eu tinha uma variável estática que tenta ler valores do app.config, e o app.config estava ausente nas configurações respectivas, resultando em uma exceção não tratada. Isso resultou na obtenção da "Referência de objeto não definida para uma instância de um objeto". como a exceção interna.

Tharaka
fonte
3

Outra coisa a verificar quando esses erros de inicialização são lançados seria verificar se a versão .NET de destino está instalada no servidor. Você pode clicar com o botão direito do mouse no projeto e ver qual versão do .NET o aplicativo está direcionando.

Sharad Shrestha
fonte
3

Eu tive o mesmo problema causado por ter duas das mesmas propriedades de configuração (que correspondem ao app.config):

    [ConfigurationProperty("TransferTimeValidity")]
Tim
fonte
2

Outro cenário que pode causar isso é quando você tem um pedaço do seu código que chama:

string sParam = **ConfigurationManager.AppSettings["SOME_PARAM"].ToString();

Lembre-se de que você precisa usar o OWSTIMER.EXE.CONFIGarquivo para definir as configurações do arquivo. Eu tinha um App.configarquivo que estava tentando ler e estava recebendo esse erro porque, na instanciação da minha instância de trabalho, havia uma linha no meu código que se referia a Connfiguration.AppSettings& Configuration.ConnectionStrings. Apenas certifique-se de seguir o caminho:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN

e coloque suas definições de configuração no OWSTIMER.EXE.CONFIGarquivo

lionel jones
fonte
2

Isso pode acontecer se você tiver uma propriedade de dependência registrada no tipo de proprietário errado (argumento ownerType).

Observe que SomeOtherControl deveria ter sido 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));
}
Adam Caviness
fonte
1

Se, por qualquer motivo, a energia acabar ou o IDE do Visual Studio travar, pode causar esse problema dentro da sua lixeira / depuração / liberação ...

Basta excluir o conteúdo e recompilar (por experiência pessoal, quando meu dedo pressionou o botão de redefinição!)

reitor
fonte
1

Eu tinha uma configuração diferente, mas ainda relacionada.

Pode ser uma seção de configuração personalizada que não foi declarada em configSections .

Apenas declare a seção e o erro deve se resolver.

TylerBUrquhart
fonte
1

Encontrei esse problema devido à incompatibilidade entre as versões de tempo de execução dos assemblies. Verifique as versões de tempo de execução do assembly principal (aplicativo de chamada) e o assembly mencionado

ShivanandSK
fonte
1

Como o erro indica, a inicialização do tipo / classe falhou. Isso geralmente ocorre quando há alguma exceção no construtor da classe. O motivo mais comum é atribuir algum valor na leitura do construtor de um arquivo de configuração e o arquivo de configuração está faltando esses valores.

zak
fonte
0

No meu caso, tive essa falha no Logger.Create dentro de uma biblioteca de classes que estava sendo usada pelo meu aplicativo principal (console). O problema foi que eu tinha esquecido de adicionar uma referência ao NLog.dll no meu aplicativo de console. A adição da referência com a versão correta da biblioteca do .NET Framework corrigiu o problema.

amor ao vivo
fonte
0

Teve um caso como este em um projeto WPF. Meu problema estava em uma linha que foi assim:

DataTable myTable = FillTable(strMySqlQuery);

Onde FillTable()retornou um DataTable com base em uma seqüência de caracteres de consulta SQL. Se eu fiz a opção "copiar exceção na área de transferência", acho que sim, e colei no bloco de notas, consegui ver a mensagem. Para mim foi The input is not a valid Base-64 string as it contains a non-base 64 character.

Meu problema real não era que a string de consulta tivesse algo que não deveria estar lá, como eu estava pensando, porque string strMySqlQuery = "SELECT * FROM My_Table"era minha string e pensei que poderia ser o *ou _, mas o problema real estava FillTable(), onde eu tinha uma ligação para outra , GetConnection()que retornou um OracleConnectionobjeto, para abri-lo, recuperar e retornar o DataTable. Lá dentro, GetConnection()eu estava obtendo os app.configparâmetros para minha cadeia de conexão, e eu tinha um deles com o nome errado, por isso definia um valor nulo para a senha da conta de serviço e não fazia a conexão com o banco de dados. Portanto, nem sempre é onde o erro é exatamente correto para todas as circunstâncias. É melhor mergulhar na função onde está o erro e depurar passo a passo e garantir que todos os valores sejam preenchidos com o que você espera.

vapcguy
fonte
0

Eu também enfrentei esse erro em duas situações

  1. Ao executar o redirecionamento da camada BAL para a camada DAL, enfrentei essa exceção. A exceção interna diz que "Erro de referência de objeto".

  2. Web.Config chave do arquivo não corresponde.

Espero que isso seja útil para resolver seu problema.

Gopi P
fonte
0

Semelhante ao que Muhammad Iqbal declarou .. Eu estava em um projeto VB.NET (também pode ser C #) em que removi um par de valores-chave do App.configqual foi referenciada por uma variável global à Sub Main()de Module Main. Portanto, a exceção (e quebra) ocorre Module Mainantes do Sub Main(). Se ao menos eu tivesse um ponto de interrupção no Dim, mas normalmente não interrompemos as variáveis ​​globais. Talvez um bom motivo para não declarar globais referenciando App.config? Em outras palavras, isso ...

Ocorreu uma exceção sem tratamento do tipo 'System.TypeInitializationException' no Módulo Desconhecido. O inicializador de tipo para 'Namespace.Main' lançou uma exceção.

É causado por...

App.config

<connectionStrings>
    <!--<add name="ConnectionString1" connectionString="..." />-->

Módulo principal

Module Main
    Dim cnnString As String = ConfigurationManager.ConnectionStrings("ConnectionString1")  '<-- BREAK HERE (EXCEPTION)

    Sub Main()

        // main code

    End Main
End Module
Adam Cox
fonte
0

No meu caso, eu tinha uma classe auxiliar que era estática. Nessa classe, havia um método para inicializar um SqlCommand dependente de variáveis. Como isso estava sendo chamado em vários lugares, eu o mudei para a classe auxiliar e chamei conforme necessário, então esse método também era estático. Agora eu tinha uma propriedade global que era a cadeia de conexão no Global.asax, apontando para a cadeia de conexão no web.config. Intermitentemente, eu receberia "O inicializador de tipo para 'Helper' lançou uma exceção". Se eu movesse o método da classe Helper para a classe em que ele estava sendo chamado, tudo seria bom. A exceção interna reclamou do objeto ser nulo (classe Helper). O que fiz foi adicionar o Using Helper ao Global.asax e, embora não estivesse sendo usado pelo Global.asax, isso resolveu o problema.

Raio
fonte
0

Minha resposta também está relacionada à seção Config. Se você atribuir valores do arquivo Config na classe estática de C # ou Module.VB do VB, você receberá esse erro no tempo de execução.

adicione key = "LogPath" value = "~ / Error_Log /"

O uso da barra no Web.Config também gera esse erro no tempo de execução. Eu apenas resolvi esse problema colocando o BackSlash

adicione key = "LogPath" value = "~ \ Error_Log \"

Mohamed Riyas
fonte
0

Enrolei minha linha que estava travando em um bloco try-catch, imprimi a exceção e violei imediatamente após a impressão. As informações de exceção mostradas tinham um rastreamento de pilha que me indicava o arquivo e a linha de código que causava a falha.

insira a descrição da imagem aqui

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.
Ivan
fonte
0

De alguma forma, sair do Visual Studio e reabri-lo resolveu isso para mim.

Kirsten Greed
fonte
0

As chaves do dicionário devem ser únicas!

No meu caso, eu estava usando um dicionário e encontrei dois itens acidentalmente com a mesma chave.

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

Digno de nota: eu tinha vários projetos em minha solução e esqueci de adicionar as bibliotecas de referências / Nuget. Quando executei um método na classe estática, que usava as bibliotecas fornecidas, lançou a exceção mencionada.

Batalha
fonte