Инициализатор типа для "MyClass" выбрал исключение

Ниже приведен код службы 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();
                }
            }
        }
    }
}

Ответ 1

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

Ответ 2

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

например
У класса есть статическая переменная

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

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

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

Ответ 3

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

Ответ 4

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

Проблема заключалась в том, что во время статической инициализации класса (используя статический конструктор) среда также инициализирует статические переменные (поля) в классе. У меня была статическая переменная, которая пытается считывать значения из app.config, а app.config пропускает соответствующие настройки, что приводит к исключению без обработки. Это привело к тому, что "Ссылка на объект не установлена ​​в экземпляр объекта". как внутреннее исключение.

Ответ 5

Еще одна вещь, которую нужно проверить, когда вызывается эти ошибки инициализации, - проверить, установлена ​​ли целевая версия .NET на сервере. Вы можете щелкнуть правой кнопкой мыши проект и посмотреть, какая версия .NET предназначена для таргетинга.

Ответ 6

У меня была та же проблема, вызванная наличием двух одинаковых свойств конфигурации (что соответствует app.config):

    [ConfigurationProperty("TransferTimeValidity")]

Ответ 7

Другой сценарий, который может вызвать это, - это когда у вас есть фрагмент кода, который вызывает:

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.

Ответ 8

Это может произойти, если у вас есть свойство зависимостей, которое зарегистрировано на неправильный тип владельца (аргумент 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));
}

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

В проекте 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 для моей строки подключения, и у меня было одно из них, поэтому оно устанавливало значение null для пароля учетной записи службы и не делало соединение с БД. Так что не всегда, где ошибка в точности соответствует всем обстоятельствам. Лучше всего погрузиться в функцию, где ошибка, и отлаживать шаг за шагом, и обеспечить, чтобы все значения заполнялись тем, что вы ожидаете.

Ответ 14

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

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

  • Web.Config Файл не совпадает.

Надеемся, что это поможет решить вашу проблему.

Ответ 15

Подобно тому, что сказал Мухаммед Икбал... Я был в проекте VB.NET (может быть также С#), где я удалил пару ключ-значение из App.config которую ссылалась переменная, глобальная для Sub Main() из Module Main. Следовательно, исключение (и разрыв) происходит в Module Main перед Sub Main(). Если бы у меня была точка Dim на 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

Ответ 16

В моем случае у меня был вспомогательный класс, который был статическим. В этом классе был метод для инициализации SqlCommand, зависящей от переменных. Поскольку это вызывалось в нескольких местах, я переместил его в вспомогательный класс и вызывал по мере необходимости, поэтому этот метод также был статическим. Теперь у меня было глобальное свойство - строка подключения в Global.asax, указывающая на строку подключения в web.config. Периодически я получал бы: "Инициализатор типа для" Помощника "выдал исключение". Если бы я переместил метод из класса Helper в класс, где он вызывался, все было хорошо. Внутреннее исключение жаловалось на нулевой объект (класс Helper). Что я сделал, так это добавил Using Helper к Global.asax, и хотя он не использовался Global.asax, это решило проблему.

Ответ 17

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

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

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

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

Ответ 18

Я обернул свою строку, которая вылетала в блоке try-catch, распечатал исключение и сразу же оборвал его после печати. У показанной информации об исключении была трассировка стека, которая указала мне на файл и строку кода, вызывающую возникновение ошибки.

enter image description here

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.

Ответ 19

Каким-то образом выход из Visual Studio и повторное его открытие решили для меня это.

Ответ 20

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