El inicializador de tipo para 'MyClass' arrojó una excepción

217

El siguiente es mi código de servicio de Windows. Cuando estoy depurando el código, obtengo el error / excepción:

El inicializador de tipo para 'CSMessageUtility.CSDetails' arrojó una excepción.

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
fuente
55
Comprobar inicialización de miembros estáticos.
Robino

Respuestas:

350

Verifique la InnerExceptionpropiedad de la TypeInitializationException; es probable que contenga información sobre el problema subyacente y exactamente dónde ocurrió.

Fredrik Mörk
fuente
44
gracias Fredrik Mörk obtuve la excepción interna "Referencia de objeto no establecida a una instancia de un objeto". lo estoy buscando
gofor.net
2
@ gofor.net: como señala @Jackson Pope; La parte interesante de su código es el método static CSDetailsen la clase CSMessageUtility.CSDetails(y cualquier método que pueda llamar). Si no encuentra el problema por su cuenta, actualice la pregunta con ese código.
Fredrik Mörk
en realidad, CSMessageUtility es una referencia dll que estoy usando y contiene varios métodos. pero cuando verifico esos métodos manualmente, no recibí ningún error. Funciona perfectamente
gofor.net
2
La excepción no siempre es válida o apunta al problema correcto. Para mí, trató de decirme The input is not a valid Base-64 string as it contains a non-base 64 characterqué función estaba volviendo a un objeto DataTable, pero para mí, en realidad, había un problema subyacente en el que estaba llamando a un app.configparámetro por el nombre incorrecto, por lo que una variable que estaba usando para formar mi cadena de conexiones fue nulo Por lo tanto, no se pudo abrir OracleConnectionen esa función para devolver la DataTable. El mejor consejo es sumergirse en la función subyacente que está devolviendo el error.
vapcguy
186

Este problema puede ser causado si una clase intenta obtener el valor de una clave en web.config o app.config que no está presente allí.

Por ejemplo,
la clase tiene una variable estática.

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

Pero el web.config no contiene la GoogleCalendarApplicationClientIDclave

El error se lanzará en cualquier llamada de función estática o en cualquier creación de instancia de clase

Muhammad Waqas Iqbal
fuente
24
Hombre, nunca lo habría descubierto por mi cuenta. Estaba confiando demasiado en los puntos de quiebre y, por desgracia, no me habrían salvado. ¡Gracias amigo! +1
Lukas
77
Estoy de acuerdo . . . Acabo de hacer exactamente lo mismo. Me estaba arrancando el pelo tratando de resolverlo. ¡Muchas gracias!
dscarr
3
Era una cadena de conexión en mi caso.
Musakkhir Sayyed
1
¡Eres un hombre rockero! eres un salvador! El proyecto referenciado ni siquiera estaba depurando (entrando) sin la entrada de configuración faltante. No había ninguna pista para relacionarse con el problema con la configuración sin profundizar en ese código. Me salvaste la semana después de que perdí 2 días: P!
Pramod Sharma
1
@MuhammadWaqasIqbal ¡Esa última oración en negrita es la clave! CUALQUIER función que use ClientIDen este ejemplo tendría este error. Buena publicación.
vapcguy
57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. significa que el constructor estático en esa clase arrojó una Excepción, por lo que debe buscar en el constructor estático de la clase CSDetails o en la inicialización de cualquier miembro estático de esa clase.

Jackson Pope
fuente
1
Bastante seguro. Estaba creando una instancia estática de log4net logger que estaba causando el problema. El problema era la versión del montaje de log4net en ese proyecto no coincide con la versión de los otros proyectos (que acabo shivan notado señalado específicamente.)
goku_da_master
1
Tuve el mismo problema usando NLog. Tiendo a inicializar mis registradores en constructores estáticos y el desajuste entre versiones en diferentes proyectos causó el problema. El uso de la misma versión en todas partes resolvió el problema.
shelbypereira
5

Me encontré con el mismo problema, cuando estaba usando métodos estáticos en una clase Util, al igual que había usado 'CSMessageUtility.CSDetails'.

El problema fue que durante la inicialización estática de la clase (usando el constructor estático), el marco también inicializa las variables estáticas (campos) en la clase. Tenía una variable estática que intenta leer valores de app.config, y app.config no tenía la configuración respectiva, lo que resultó en una excepción no manejada. Esto resultó en la obtención de la "Referencia de objeto no establecida en una instancia de un objeto". como la excepción interna

Tharaka
fuente
3

Otra cosa para verificar cuando se generan estos errores de inicialización sería verificar si la versión de .NET de destino está instalada en el servidor. Puede hacer clic con el botón derecho en el proyecto y ver a qué versión .NET apunta la aplicación.

Sharad Shrestha
fuente
3

He tenido el mismo problema causado por tener dos de las mismas propiedades de configuración (que coincide con la app.config):

    [ConfigurationProperty("TransferTimeValidity")]
Tim
fuente
2

Otro escenario que puede causar esto es cuando tienes una parte de tu código que llama:

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

Tenga en cuenta que debe usar el OWSTIMER.EXE.CONFIGarchivo para la configuración del archivo de configuración. Tenía un App.configarchivo que intentaba leer y recibía este error porque al crear una instancia de mi instancia de trabajo, tenía una línea en mi código que se refería a Connfiguration.AppSettings& Configuration.ConnectionStrings. Solo asegúrate de seguir el camino:

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

y coloque su configuración en el OWSTIMER.EXE.CONFIGarchivo.

Lionel Jones
fuente
2

Esto puede suceder si tiene una propiedad de dependencia que está registrada en el tipo de propietario incorrecto (argumento ownerType).

Observe que SomeOtherControl debería haber 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
fuente
1

Si por alguna razón se corta la energía o el IDE de Visual Studio se bloquea, puede causar este problema dentro de su bin / debug bin / release ...

Simplemente elimine el contenido y vuelva a compilar (por experiencia personal cuando mi dedo del pie presione el botón de reinicio).

Decano
fuente
1

Tenía una configuración diferente pero aún relacionada.

Podría ser una sección de configuración personalizada que no se haya declarado en configSections .

Simplemente declare la sección y el error debería resolverse solo.

TylerBUrquhart
fuente
1

Encontré este problema debido a la falta de coincidencia entre las versiones de tiempo de ejecución de los ensamblados. Verifique las versiones de tiempo de ejecución del ensamblaje principal (aplicación de llamada) y el ensamblado referido

ShivanandSK
fuente
1

Como dice el Error, la inicialización del Tipo / Clase falló. Esto generalmente ocurre cuando hay alguna excepción en el constructor de la clase. La razón más común es que asigna algún valor en la lectura del constructor de un archivo de configuración y el archivo de configuración no tiene esos valores.

zak
fuente
0

En mi caso, tuve este error en Logger. Crear dentro de una biblioteca de clase que estaba siendo utilizada por mi aplicación principal (consola). El problema era que había olvidado agregar una referencia a NLog.dll en mi aplicación de consola. Agregar la referencia con la versión correcta de la biblioteca .NET Framework solucionó el problema.

vive el amor
fuente
0

Tuve un caso como este en un proyecto de WPF. Mi problema estaba en una línea que decía así:

DataTable myTable = FillTable(strMySqlQuery);

Donde FillTable()devolvió un DataTable basado en una cadena de consulta SQL. Si hice la opción "copiar excepción al portapapeles", creo que fue, y pegado en el Bloc de notas, podría ver el mensaje. Para mí lo fue The input is not a valid Base-64 string as it contains a non-base 64 character.

Mi problema real no era que la cadena de consulta tenía algo que no debería estar allí, como estaba pensando, porque string strMySqlQuery = "SELECT * FROM My_Table"era mi cadena y pensaba que podría ser el *o _, pero el problema real estaba en FillTable(), donde tuve una llamada a otro función, GetConnection()que devolvió un OracleConnectionobjeto, para abrirlo y recuperar y devolver la DataTable. En el interior GetConnection(), estaba obteniendo los app.configparámetros para mi cadena de conexión, y tenía uno de ellos mal nombrado, por lo que estaba estableciendo un valor nulo para la contraseña de la cuenta de servicio y no establecía la conexión DB. Por lo tanto, no siempre es donde el error es exactamente correcto para todas las circunstancias. Es mejor sumergirse en la función donde está el error y depurar paso a paso y asegurarse de que todos los valores se llenen con lo que espera.

vapcguy
fuente
0

Yo también enfrenté este error en dos situaciones

  1. Mientras realizaba la redirección de la capa BAL a la capa DAL, me enfrenté a esta excepción. La excepción interna dice que "Error de referencia de objeto".

  2. Web.Config La clave de archivo no coincide.

Espero que esto sea útil para resolver su problema.

Gopi P
fuente
0

Similar a lo que dijo Muhammad Iqbal. Estaba en un proyecto VB.NET (también puede ser C #) donde eliminé un par clave-valor del App.configque fue referenciado por una variable global a la Sub Main()de Module Main. Por lo tanto, la excepción (y ruptura) ocurre Module Mainantes del Sub Main(). Si solo tuviera un punto de quiebre en el Dim, pero no solemos romper en las variables globales. ¿Quizás una buena razón para no declarar los globales que hacen referencia a App.config? En otras palabras, esto ...

Se produjo una excepción no controlada del tipo 'System.TypeInitializationException' en Unknown Module. El inicializador de tipo para 'Namespace.Main' arrojó una excepción.

Es 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
fuente
0

En mi caso, tenía una clase auxiliar que era estática. En esa clase había un método para inicializar un SqlCommand dependiente de variables. Como esto se llamaba en varios lugares, lo moví a la clase auxiliar y llamé según fuera necesario, por lo que este método también era estático. Ahora tenía una propiedad global que era la cadena de conexión en Global.asax apuntando a la cadena de conexión en web.config. De forma intermitente obtenía "El inicializador de tipo para 'Helper' arrojó una excepción". Si moví el método de la clase Helper a la clase desde donde se estaba llamando, todo fue bueno. La excepción interna se quejó de que el objeto era nulo (clase Helper). Lo que hice fue agregar Using Helper a Global.asax y, aunque Global.asax no lo estaba utilizando, esto resolvió el problema.

Rayo
fuente
0

Mi respuesta también está relacionada con la sección Configuración. Si asigna valores del archivo de configuración en la clase estática de C # o Module.VB de VB, obtendrá este error en tiempo de ejecución.

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

El uso de la barra diagonal en Web.Config también genera este error en el tiempo de ejecución. Acabo de resolver este problema poniendo BackSlash

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

Mohamed Riyas
fuente
0

Envolví mi línea que se estrellaba en un bloque try-catch, imprimí la excepción y la rompí inmediatamente después de que se imprimió. La información de excepción mostrada tenía un seguimiento de pila que me señalaba el archivo y la línea de código que causaba la falla.

ingrese la descripción de la imagen aquí

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
fuente
0

De alguna manera, salir de Visual Studio y volver a abrirlo resolvió esto para mí.

Avaricia de Kirsten
fuente
0

¡Las claves del diccionario deben ser únicas!

En mi caso, estaba usando un diccionario, y encontré que dos elementos tenían accidentalmente la misma clave.

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

Notable: tuve varios proyectos en mi solución y olvidé agregar las bibliotecas de referencias / Nuget. Cuando ejecuté un método en la clase estática, que usaba las bibliotecas dadas, arrojó la excepción mencionada.

Batalla
fuente