Ініціалізатор типу для "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: як вказує @Jackson Pope; цікава частина вашого коду - метод 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!
Pramod Sharma

1
@MuhammadWaqasIqbal Це останнє жирне речення є ключовим !!! Будь-яка функція, яка використовується ClientIDв цьому прикладі, мала б цю помилку Чудовий пост.
vapcguy

57

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


1
Звичайно, досить. Я створював статичний екземпляр реєстратора log4net, який викликав проблему. Проблема полягала в тому, що версія збірки log4net у цьому проекті не відповідала версії в інших проектах (на що я лише зауважив, що Шиван спеціально вказав)
goku_da_master

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

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 повинен був бути Вашим Контролем .

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

Якщо з будь-якої причини джерело живлення або Visual Studio IDE виходить з ладу, це може спричинити цю проблему всередині вашого кошика / відладки / випуску ...

Просто видаліть вміст і перекомпілюйте (з особистого досвіду, коли мій палець натискає кнопку скидання!)


1

У мене була інша, але все ще пов'язана конфігурація.

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

Просто оголосіть розділ, і помилка повинна вирішитись.


1

З цією проблемою я зіткнувся через невідповідність між версіями виконання збірок. Перевірте версії виконання основної збірки (виклику програми) та згаданої збірки


1

Як говорить Помилка, ініціалізація типу / класу не вдалася. Зазвичай це відбувається, коли в конструкторі класу є якийсь виняток. Найчастіша причина - ви присвоюєте деяке значення конструктору читання з конфігураційного файлу, а у конфігураційному файлі відсутні ці значення.


0

У моєму випадку я виявив цю помилку в Logger.Create у бібліотеці класів, яку використовував мій головний (консольний) додаток. Проблема полягала в тому, що я забув додати посилання на NLog.dll у своєму консольному додатку. Додавання посилання з правильною версією бібліотеки .NET Framework вирішило проблему.


0

Був такий випадок у проекті WPF. Моя проблема була в такій лінії:

DataTable myTable = FillTable(strMySqlQuery);

Де FillTable()повернуто таблицю даних на основі рядка запиту 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()про 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 в клас, куди його викликали всі, було б добре. Внутрішній виняток скаржився на те, що об’єкт є нульовим (клас Helper). Що я зробив, це додати програму Helper до Global.asax, і хоча вона не використовувалась Global.asax, це вирішило проблему.


0

Моя відповідь також стосується розділу Config. Якщо ви присвоїте значення файлу Config для статичного класу C # або Module.VB VB, ви отримаєте цю помилку під час виконання.

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

Використання нахильної косої риски в Web.Config також призводить до цієї помилки під час виконання. Я просто вирішив цю проблему, поставивши BackSlash

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


0

Я завернув свою лінію, яка зазнала збоїв у блоці спроб лову, роздрукував виняток і зламав одразу після того, як він був надрукований. Відображена інформація про виключення мала трасування стека, яке вказувало мені на файл та рядок коду, що спричинило виникнення помилки.

введіть тут опис зображення

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.