Инициализатор типа для «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
Проверьте инициализацию статических элементов.
Робино

Ответы:


351

Проверьте InnerExceptionсобственность TypeInitializationException; скорее всего, она содержит информацию об основной проблеме и о том, где именно она возникла.


4
спасибо Фредрик Мёрк, я получил внутреннее исключение «Ссылка на объект не установлена ​​на экземпляр объекта». я проверяю это
gofor.net

2
@ gofor.net: как отмечает @Джексон Поуп; Интересной частью вашего кода является метод static CSDetailsв классе CSMessageUtility.CSDetails(и любые методы, которые он может вызывать). Если вы не нашли проблему самостоятельно, обновите вопрос этим кодом.
Фредрик Мёрк

на самом деле CSMessageUtility - это dll-ссылка, которую я использую, и она содержит несколько методов. но когда я проверяю эти методы вручную, я не получаю никакой ошибки. он работает отлично
gofor.net

2
Исключение не всегда допустимо или указывает на правильную проблему. Для меня это попытка сказать мне, The input is not a valid Base-64 string as it contains a non-base 64 characterчто функция возвращала объекту DataTable, но для меня, на самом деле, была основная проблема, когда я вызывал app.configпараметр с неправильным именем, поэтому переменную я использовал для формирования строки подключения был нулевым Поэтому он не может открыть OracleConnectionфункцию в этой функции для возврата DataTable. Лучший совет - погрузиться в основную функцию, которая возвращает ошибку.
vapcguy

186

Эта проблема может быть вызвана, если класс пытается получить значение ключа в web.config или app.config, которого там нет.

например,
класс имеет статическую переменную

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

Но web.config не содержит GoogleCalendarApplicationClientIDключ

Ошибка будет выдана при любом статическом вызове функции или создании экземпляра любого класса


24
Человек, которого я никогда бы не узнал сам. Я слишком сильно полагался на перерывы, и, увы, они бы меня не спасли. Спасибо, приятель! +1
Лукас

7
Я согласен . , , У меня только что произошло то же самое. Вырывал мои волосы, пытаясь понять это. Большое спасибо!
dscarr

3
это была строка подключения в моем случае.
Мусакхир Сайед

1
Вы рок человек! ты спаситель! Упомянутый проект даже не отлаживался (не входил) без отсутствующей записи конфигурации. Не было никакой подсказки, касающейся проблемы с конфигурацией, не углубляясь в этот код. Вы спасли мою неделю после того, как я потратил 2 дня: P!
Прамод Шарма

1
@MuhammadWaqasIqbal Это последнее выделенное жирным шрифтом предложение является ключом !!! Любая функция, которая использует ClientIDв этом примере, будет иметь эту ошибку. Отличный пост.
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. означает, что статический конструктор этого класса вызвал исключение - поэтому вам нужно искать либо в статическом конструкторе класса CSDetails, либо в инициализации любых статических членов этого класса.


1
Конечно же Я создавал статический экземпляр log4net logger, который вызывал проблему. Проблема заключалась в том, что версия сборки log4net в этом проекте не совпадала с версией в других проектах (на что я только что обратил внимание, специально указал
Шиван

1
У меня была такая же проблема с использованием NLog. Я склонен инициализировать мои логгеры в статических конструкторах, и проблема вызвана несоответствием версий в разных проектах. использование одной и той же версии везде решило проблему.
Шелбиперейра

5

Я столкнулся с той же проблемой, когда использовал статические методы в классе Util, так же, как вы использовали CSMessageUtility.CSDetails.

Проблема заключалась в том, что во время статической инициализации класса (с использованием статического конструктора) платформа также инициализирует статические переменные (поля) в классе. У меня была статическая переменная, которая пытается прочитать значения из 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

Если по какой-либо причине происходит сбой питания или происходит сбой IDE Visual Studio, это может вызвать эту проблему в вашем bin / debug bin / release ...

Просто удалите содержимое и перекомпилируйте (из личного опыта, когда мой палец нажал кнопку сброса!)


1

У меня была другая, но все еще связанная конфигурация.

Может быть пользовательский раздел конфигурации, который не был объявлен в configSections .

Просто объявите раздел, и ошибка должна разрешиться сама собой.


1

Я столкнулся с этой проблемой из-за несоответствия между версиями сборок во время выполнения. Проверьте версии среды выполнения основной сборки (вызывающего приложения) и указанной сборки.


1

Как говорит ошибка, инициализация типа / класса не удалась. Это обычно происходит, когда в конструкторе класса есть какое-то исключение. Наиболее распространенная причина заключается в том, что вы присваиваете какое-то значение в конструкторе, считывающем из файла конфигурации, а в файле конфигурации отсутствуют эти значения.


0

В моем случае это происходило с ошибкой в ​​Logger.Create внутри библиотеки классов, которая использовалась моим основным (консольным) приложением. Проблема была в том, что я забыл добавить ссылку на NLog.dll в моем консольном приложении. Добавление ссылки с правильной версией библиотеки .NET Framework устранило проблему.


0

Был такой случай в проекте WPF. Моя проблема была на линии, которая шла так:

DataTable myTable = FillTable(strMySqlQuery);

Где FillTable()возвращается DataTable на основе строки запроса SQL. Если бы я сделал опцию «копировать исключение в буфер обмена», я думаю, что это было, и вставил в Блокнот, я мог видеть сообщение. Для меня это былоThe input is not a valid Base-64 string as it contains a non-base 64 character .

Моя настоящая проблема заключалась не в том, что в строке запроса было что-то, чего не должно было быть, как я думал, потому что string strMySqlQuery = "SELECT * FROM My_Table"была моя строка, и я думал, что это может быть *или _, но на самом деле проблема была в том FillTable(), что у меня был вызов другого функция, GetConnection()которая возвратила OracleConnectionобъект, чтобы открыть его, получить и вернуть DataTable. Внутри GetConnection()я получал app.configпараметры для моей строки подключения, и у меня был один из них неправильно назван, поэтому он устанавливал нулевое значение для пароля учетной записи службы и не устанавливал соединение с БД. Так что это не всегда, где ошибка точно верна для всех обстоятельств. Лучше всего погрузиться в функцию, где есть ошибка, и выполнить пошаговую отладку и убедиться, что все значения заполняются тем, что вы ожидаете.


0

Я тоже сталкивался с этой ошибкой в ​​двух ситуациях

  1. При выполнении перенаправления с уровня BAL на уровень DAL я столкнулся с этим исключением. Внутреннее исключение говорит, что «Ошибка ссылки на объект».

  2. Web.Config Ключ файла не совпадает.

Надеюсь, что это полезно для решения вашей проблемы.


0

Подобно тому, что сказал Мухаммед Икбал ... Я был в проекте VB.NET (может быть также C #), где я удалил пару ключ-значение из той, на App.configкоторую ссылалась глобальная переменная Sub Main()of of 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). Что я сделал, так это добавил Using Helper к Global.asax, и хотя он не использовался Global.asax, это решило проблему.


0

Мой ответ также связан с разделом Config. Если вы присваиваете значения из файла конфигурации в статическом классе C # или Module.VB VB, вы получите эту ошибку во время выполнения.

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

Использование прямой косой черты в Web.Config также приводит к этой ошибке во время выполнения. Я только решил эту проблему, поставив BackSlash

add 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

Ключи словаря должны быть уникальными!

В моем случае я использовал словарь и обнаружил, что два элемента в нем случайно имеют один и тот же ключ.

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

0

Примечательно: в моем решении было несколько проектов, и я забыл добавить библиотеки ссылок / Nuget. Когда я запустил метод в статическом классе, который использовал данные библиотеки, он бросил упомянутое исключение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.