Penginisialisasi tipe untuk 'MyClass' memberikan pengecualian


217

Berikut ini adalah kode layanan Windows saya. Ketika saya debug kode, saya mendapatkan kesalahan / pengecualian:

Penginisialisasi tipe untuk 'CSMessageUtility.CSDetails' memberikan pengecualian.

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
Periksa inisialisasi anggota statis.
Robino

Jawaban:


350

Periksa InnerExceptionproperti dari TypeInitializationException; kemungkinan berisi informasi tentang masalah yang mendasarinya, dan di mana tepatnya hal itu terjadi.


4
terima kasih Fredrik Mörk saya mendapat pengecualian dalam "Referensi objek tidak disetel ke instance objek." saya mengeceknya
gofor.net

2
@ gofor.net: seperti yang ditunjukkan @Jackson Pope; bagian yang menarik dari kode Anda adalah metode static CSDetailsdi kelas CSMessageUtility.CSDetails(dan metode apa pun yang dipanggil). Jika Anda tidak menemukan masalah sendiri, perbarui pertanyaan dengan kode itu.
Fredrik Mörk

sebenarnya CSMessageUtility adalah referensi dll yang saya gunakan dan ini berisi beberapa metode. tetapi ketika saya memeriksa metode-metode itu secara manual, saya tidak mendapatkan error.it berfungsi dengan baik
gofor.net

2
Pengecualian tidak selalu valid atau menunjuk ke masalah yang tepat. Bagi saya, itu mencoba memberi tahu saya The input is not a valid Base-64 string as it contains a non-base 64 characterapa fungsi kembali ke objek DataTable, tetapi bagi saya, sebenarnya ada masalah mendasar di mana saya memanggil app.configparameter dengan nama yang salah, jadi variabel yang saya gunakan untuk membentuk connectionstring saya adalah nol. Oleh karena itu tidak bisa membuka OracleConnectionfungsi itu untuk mengembalikan DataTable. Saran terbaik adalah untuk menyelami fungsi yang mendasari yang mengembalikan kesalahan.
vapcguy

186

Masalah ini dapat disebabkan jika suatu kelas mencoba untuk mendapatkan nilai kunci di web.config atau app.config yang tidak ada di sana.

mis
. Kelas memiliki variabel statis

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

Tetapi web.config tidak mengandung GoogleCalendarApplicationClientIDkunci

Kesalahan akan terjadi pada panggilan fungsi statis atau pembuatan instance kelas apa pun


24
Man, aku tidak akan pernah menemukan itu sendiri. Saya terlalu mengandalkan titik istirahat dan, sayangnya, mereka tidak akan menyelamatkan saya. Terima kasih bud! +1
Lukas

7
Saya setuju . . . Saya baru saja mengalami hal yang sama persis terjadi. Sedang mencabut rambutku berusaha mencari tahu. Terimakasih banyak!
dscarr

3
itu string koneksi dalam kasus saya.
Musakkhir Sayyed

1
Kamu manusia batu! kamu adalah penyelamat! Proyek yang direferensikan bahkan tidak men-debug (melangkah ke) tanpa entri konfigurasi yang hilang. Tidak ada petunjuk untuk berhubungan dengan masalah dengan konfigurasi tanpa memasukkan ke dalam kode itu. Anda menyimpan minggu saya setelah saya menghabiskan 2 hari: P!
Pramod Sharma

1
@MuhammadWaqasIqbal Kalimat tebal terakhir itu adalah kuncinya !!! Setiap fungsi yang digunakan ClientIDdalam contoh ini akan memiliki kesalahan ini. Pos yang bagus.
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. berarti konstruktor statis pada kelas itu melemparkan Pengecualian - jadi Anda perlu melihat apakah ada konstruktor statis kelas CSDetails, atau dalam inisialisasi anggota statis kelas itu.


1
Tentu saja. Saya membuat instance statis log4net logger yang menyebabkan masalah. Masalahnya adalah versi perakitan log4net dalam proyek itu tidak cocok dengan versi di proyek-proyek lain (yang saya perhatikan secara khusus ditunjukkan oleh shivan.)
goku_da_master

1
Saya memiliki masalah yang sama menggunakan NLog. Saya cenderung menginisialisasi penebang saya di konstruktor statis dan ketidakcocokan antara versi dalam proyek berbeda menyebabkan masalah. menggunakan versi yang sama di mana-mana menyelesaikan masalah.
shelbypereira

5

Saya mengalami masalah yang sama, ketika saya menggunakan metode statis di kelas Util, sama seperti Anda telah menggunakan 'CSMessageUtility.CSDetails'.

Masalahnya adalah bahwa selama inisialisasi statis kelas (menggunakan konstruktor statis), kerangka kerja juga menginisialisasi variabel statis (bidang) di kelas. Saya memiliki variabel statis yang mencoba membaca nilai dari app.config, dan app.config tidak memiliki pengaturan masing-masing, sehingga menghasilkan pengecualian yang tidak ditangani. Ini menghasilkan "referensi objek yang tidak disetel ke instance objek." sebagai pengecualian batin.


3

Satu hal lagi untuk memeriksa ketika kesalahan inisialisasi ini dilemparkan adalah untuk memeriksa apakah target. Versi NET diinstal pada server. Anda dapat mengklik kanan proyek dan melihat apa. NET versi aplikasi penargetan.


3

Saya mengalami masalah yang sama yang disebabkan oleh memiliki dua properti konfigurasi yang sama (yang cocok dengan app.config):

    [ConfigurationProperty("TransferTimeValidity")]

2

Skenario lain yang mungkin menyebabkan ini adalah ketika Anda memiliki bagian dari kode Anda yang memanggil:

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

Perlu diingat bahwa Anda harus menggunakan OWSTIMER.EXE.CONFIG file untuk pengaturan file konfigurasi. Saya memiliki App.configfile yang saya coba baca dan saya mendapatkan kesalahan ini karena pada contoh instance pekerjaan saya, saya memiliki baris dalam kode saya yang merujuk ke Connfiguration.AppSettings& Configuration.ConnectionStrings. Pastikan Anda mengikuti jalan:

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

dan letakkan pengaturan konfigurasi Anda dalam OWSTIMER.EXE.CONFIGfile.


2

Ini bisa terjadi jika Anda memiliki properti ketergantungan yang terdaftar ke tipe pemilik yang salah (argumen ownerType).

Perhatikan SomeOtherControl seharusnya menjadi 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

Jika karena alasan apa pun daya berjalan atau Visual Studio IDE lumpuh dapat menyebabkan masalah ini di dalam bin / debug bin / release ...

Hapus saja konten dan kompilasi ulang (dari pengalaman pribadi ketika jari kaki saya menekan tombol reset!)


1

Saya memiliki konfigurasi yang berbeda tetapi masih terkait.

Bisa jadi bagian konfigurasi khusus yang belum dideklarasikan di configSections .

Cukup deklarasikan bagian dan kesalahan harus menyelesaikan sendiri.


1

Saya mengalami masalah ini karena ketidakcocokan antara versi runtime majelis. Harap verifikasi versi runtime dari rakitan utama (aplikasi panggilan) dan rakitan yang dimaksud


1

Sebagai Kesalahan mengatakan inisialisasi Tipe / Kelas gagal. Ini biasanya terjadi ketika ada beberapa pengecualian dalam konstruktor kelas. Alasan paling umum adalah Anda menetapkan beberapa nilai dalam pembacaan konstruktor dari file konfigurasi dan file konfigurasi hilang nilai-nilai tersebut.


0

Dalam kasus saya, saya mengalami kegagalan pada Logger.Buat di dalam perpustakaan kelas yang sedang digunakan oleh aplikasi (konsol) utama saya. Masalahnya adalah saya lupa menambahkan referensi ke NLog.dll di aplikasi konsol saya. Menambahkan referensi dengan versi .NET Framework library yang benar memperbaiki masalah.


0

Punya kasus seperti ini dalam proyek WPF. Masalah saya ada pada baris yang berbunyi seperti ini:

DataTable myTable = FillTable(strMySqlQuery);

Di mana FillTable()mengembalikan DataTable berdasarkan string kueri SQL. Jika saya melakukan opsi "salin pengecualian ke clipboard", saya pikir itu, dan disisipkan ke Notepad, saya bisa melihat pesannya. Bagi saya, ituThe input is not a valid Base-64 string as it contains a non-base 64 character .

Masalah saya yang sebenarnya bukan bahwa string kueri memiliki sesuatu yang seharusnya tidak ada di sana, seperti yang saya pikirkan, karena string strMySqlQuery = "SELECT * FROM My_Table"string saya dan berpikir itu bisa menjadi *atau _, tetapi masalah sebenarnya ada di FillTable(), di mana saya memiliki panggilan ke yang lain fungsi, GetConnection()yang mengembalikan OracleConnectionobjek, untuk membukanya dan mengambil dan mengembalikan DataTable. Di dalam GetConnection()saya mendapatkan app.configparameter untuk string koneksi saya, dan salah satu dari mereka salah nama, jadi itu menetapkan nilai nol untuk kata sandi akun layanan dan tidak membuat koneksi DB. Jadi itu tidak selalu di mana kesalahan itu benar untuk semua keadaan. Terbaik untuk menyelami fungsi di mana kesalahan itu dan debug langkah demi langkah dan memastikan semua nilai dipenuhi dengan apa yang Anda harapkan.


0

Saya juga menghadapi kesalahan ini dalam dua situasi

  1. Saat melakukan pengalihan dari lapisan BAL ke lapisan DAL saya menghadapi pengecualian ini. Pengecualian dalam mengatakan bahwa "Kesalahan Referensi Objek".

  2. Web.Config kunci file tidak cocok.

Semoga ini bermanfaat untuk menyelesaikan masalah Anda.


0

Mirip dengan apa yang dinyatakan Muhammad Iqbal .. saya di VB.NET sebuah (mungkin juga C #) proyek di mana saya menghapus pasangan kunci-nilai dari App.configyang direferensikan oleh variabel global ke Sub Main()dari Module Main. Oleh karena itu, pengecualian (dan istirahat) terjadi Module Mainsebelum Sub Main(). Kalau saja saya punya break-point pada Dim, tetapi kita biasanya tidak istirahat pada variabel global. Mungkin alasan yang bagus untuk tidak menyatakan global merujuk pada App.config? Dengan kata lain, ini ...

Pengecualian dari jenis 'System.TypeInitializationException' terjadi di Modul Tidak Dikenal. Jenis initializer untuk 'Namespace.Main' memberikan pengecualian.

Disebabkan oleh...

App.config

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

Modul utama

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

    Sub Main()

        // main code

    End Main
End Module

0

Dalam kasus saya, saya memiliki kelas pembantu yang statis. Di kelas itu adalah metode untuk menginisialisasi SqlCommand tergantung pada variabel. Karena ini dipanggil di beberapa tempat, saya memindahkannya ke kelas helper dan dipanggil sesuai kebutuhan, jadi metode ini juga statis. Sekarang saya memiliki properti global yang merupakan string koneksi di Global.asax yang menunjuk ke string koneksi di web.config. Kadang-kadang saya akan mendapatkan "Penginisialisasi tipe untuk 'Helper' melemparkan pengecualian". Jika saya memindahkan metode dari kelas Helper ke kelas di mana ia dipanggil dari semua itu baik. Pengecualian batin mengeluhkan objek menjadi nol (kelas Helper). Apa yang saya lakukan adalah menambahkan Menggunakan Helper ke Global.asax dan meskipun itu tidak digunakan oleh Global.asax ini memecahkan masalah.


0

Jawaban saya juga terkait dengan bagian Konfigurasi. Jika Anda menetapkan nilai dari file Config di kelas statis C # atau Module.VB dari VB, Anda akan mendapatkan kesalahan ini saat dijalankan.

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

Menggunakan Forward slash di Web.Config juga menyebabkan kesalahan ini saat Jalankan. Saya baru saja menyelesaikan masalah ini dengan meletakkan BackSlash

tambah kunci = "LogPath" value = "~ \ Error_Log \"


0

Saya membungkus baris saya yang menabrak blok try-catch, mencetak pengecualian, dan langsung memecahkannya setelah dicetak. Informasi pengecualian yang ditampilkan memiliki jejak tumpukan yang mengarahkan saya ke file dan baris kode yang menyebabkan kesalahan terjadi.

masukkan deskripsi gambar di sini

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

Entah bagaimana keluar dari Visual Studio dan membukanya kembali memecahkan ini untuk saya.


0

Kunci kamus harus unik!

Dalam kasus saya, saya menggunakan Kamus, dan saya menemukan dua item di dalamnya secara tidak sengaja memiliki kunci yang sama.

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

0

Patut dicatat: Saya punya beberapa proyek dalam solusi saya dan saya lupa menambahkan referensi / pustaka Nuget. Ketika saya menjalankan metode di kelas statis, yang menggunakan perpustakaan yang diberikan, itu melemparkan pengecualian yang disebutkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.