initializer ชนิดสำหรับ 'MyClass' มีข้อยกเว้น


218

ต่อไปนี้เป็นรหัสบริการ Windows ของฉัน เมื่อฉันดีบักรหัสฉันได้รับข้อผิดพลาด / ข้อยกเว้น:

ประเภทการเริ่มต้นสำหรับ 'CSMessageUtility.CSD รายละเอียด' แสดงข้อยกเว้น

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
ตรวจสอบการเริ่มต้นของสมาชิกแบบคงที่
Robino

คำตอบ:


351

ตรวจสอบInnerExceptionคุณสมบัติของTypeInitializationException; มีแนวโน้มที่จะมีข้อมูลเกี่ยวกับปัญหาพื้นฐานและสิ่งที่เกิดขึ้น


4
ขอบคุณ Fredrik Mörkฉันได้รับข้อยกเว้นภายใน "การอ้างอิงวัตถุไม่ได้ถูกตั้งค่าเป็นอินสแตนซ์ของวัตถุ" ฉันกำลังตรวจสอบมัน
gofor.net

2
@ gofor.net: @Jackson Pope ชี้ให้เห็น; ส่วนที่น่าสนใจของรหัสของคุณคือวิธีการstatic CSDetailsในชั้นเรียนCSMessageUtility.CSDetails(และวิธีการใด ๆ ที่มันอาจเรียก) หากคุณไม่พบปัญหาด้วยตนเองให้อัปเดตคำถามด้วยรหัสนั้น
Fredrik Mörk

จริงๆแล้ว CSMessageUtility คือการอ้างอิง dll ที่ฉันใช้และสิ่งนี้มีหลายวิธี แต่เมื่อฉันตรวจสอบวิธีการเหล่านั้นด้วยตนเองฉันไม่ได้รับ error.it ทำงานได้อย่างสมบูรณ์
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
Lukas

7
ฉันเห็นด้วย . . . ฉันเพิ่งมีสิ่งเดียวกันที่แน่นอนเกิดขึ้น พยายามดึงผมออกมา ขอบคุณมาก!
dscarr

3
มันเป็นสตริงการเชื่อมต่อในกรณีของฉัน
Musakkhir Sayyed

1
คุณร็อคแมน! คุณเป็นผู้กอบกู้! โครงการที่อ้างอิงไม่ได้ทำการดีบั๊ก (เข้าสู่) โดยไม่มีรายการกำหนดค่าที่ขาดหายไป ไม่มีเงื่อนงำที่เกี่ยวข้องกับปัญหาของการกำหนดค่าโดยไม่ต้องสอดเข้าไปในรหัสนั้น คุณบันทึกสัปดาห์ของฉันหลังจากที่ฉันเสียเวลา 2 วัน: P!
Pramod Sharma

1
@MuhammadWaqasIqbal ประโยคตัวหนาสุดท้ายคือกุญแจ !!! ฟังก์ชันใด ๆ ที่ใช้ClientIDในตัวอย่างนี้จะมีข้อผิดพลาดนี้ โพสต์ยอดเยี่ยม
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. หมายความว่าตัวสร้างแบบคงที่ในคลาสนั้นมีข้อยกเว้น - ดังนั้นคุณต้องดูทั้งในตัวสร้างแบบคงที่ของคลาส CSDetails หรือในการเริ่มต้นของสมาชิกแบบคงที่ของคลาสนั้น


1
นั่นเองค่ะ ฉันกำลังสร้างอินสแตนซ์แบบคงที่ของตัวบันทึก log4net ที่ทำให้เกิดปัญหา ปัญหาคือรุ่นของชุดประกอบ log4net ในโครงการที่ไม่ตรงกับรุ่นในโครงการอื่น ๆ (ซึ่งฉันเพิ่งสังเกตเห็น shivan ชี้เฉพาะ)
goku_da_master

1
ฉันมีปัญหาเดียวกันโดยใช้ NLog ฉันมักจะเริ่มต้น loggers ของฉันในตัวสร้างแบบคงที่และไม่ตรงกันระหว่างรุ่นในโครงการ differents ทำให้เกิดปัญหา ใช้รุ่นเดียวกันทุกที่แก้ไขปัญหา
shelbypereira

5

ฉันพบปัญหาเดียวกันเมื่อฉันใช้วิธีการคงที่ในคลาส Util เหมือนกับที่คุณใช้ 'CSMessageUtility.CSD รายละเอียด'

ปัญหาคือว่าในช่วงเริ่มต้นคงที่ของชั้นเรียน (ใช้ตัวสร้างคงที่) กรอบยังเริ่มต้นตัวแปรคงที่ (เขต) ในชั้นเรียน ฉันมีตัวแปรสแตติกที่พยายามอ่านค่าจาก 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แฟ้มที่ผมพยายามที่จะอ่านและผมได้รับข้อผิดพลาดนี้เพราะ instantiation ของอินสแตนซ์งานของฉันฉันมีสายในรหัสของฉันที่ได้รับการพูดถึงและ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

ถ้าพลังงานไม่ว่าด้วยสาเหตุใดก็ตามหรือ Visual Studio IDE ขัดข้องอาจทำให้เกิดปัญหานี้ภายใน bin / debug bin / release ...

เพียงแค่ลบเนื้อหาและคอมไพล์ใหม่ (จากประสบการณ์ส่วนตัวเมื่อนิ้วเท้าของฉันกดปุ่มรีเซ็ต!)


1

ฉันมีการกำหนดค่าที่แตกต่าง แต่ยังเกี่ยวข้องกัน

อาจเป็นส่วนกำหนดค่าที่กำหนดเองที่ยังไม่ได้ประกาศในconfigSections configSections

เพิ่งประกาศส่วนและข้อผิดพลาดควรแก้ไขเอง


1

ฉันพบปัญหานี้เนื่องจากความไม่ตรงกันระหว่างชุดประกอบเวอร์ชันรันไทม์ โปรดตรวจสอบเวอร์ชันรันไทม์ของชุดประกอบหลัก (แอปพลิเคชันการโทร) และชุดประกอบที่แนะนำ


1

ในฐานะที่เป็นข้อผิดพลาดกล่าวว่าการเริ่มต้นของประเภท / ชั้นล้มเหลว สิ่งนี้มักจะเกิดขึ้นเมื่อมีข้อยกเว้นในตัวสร้างของคลาส สาเหตุที่พบบ่อยที่สุดคือคุณกำหนดค่าบางอย่างในคอนสตรัคเตอร์ที่อ่านจากไฟล์กำหนดค่าและไฟล์กำหนดค่าขาดค่าเหล่านั้น


0

ในกรณีของฉันฉันมีสิ่งนี้ล้มเหลวใน Logger.Create ภายในไลบรารีคลาสที่ถูกใช้โดยแอพ (คอนโซล) หลักของฉัน ปัญหาคือฉันลืมเพิ่มการอ้างอิงถึง NLog.dll ในแอปคอนโซลของฉัน การเพิ่มการอ้างอิงด้วยรุ่นไลบรารี่. NET Framework ที่ถูกต้องช่วยแก้ไขปัญหาได้


0

มีกรณีเช่นนี้ในโครงการ WPF ปัญหาของฉันอยู่ในบรรทัดที่เป็นเช่นนี้:

DataTable myTable = FillTable(strMySqlQuery);

โดยที่FillTable()ส่งคืน DataTable ตามสตริงการสืบค้น SQL ถ้าฉันทำตัวเลือก "คัดลอกข้อยกเว้นไปยังคลิปบอร์ด" ฉันคิดว่ามันเป็นและวางลงใน Notepad ฉันจะเห็นข้อความ สำหรับฉันมันเป็น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' ในโมดูลที่ไม่รู้จัก initializer ชนิดสำหรับ '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 ไปยังคลาสที่มันถูกเรียกจากทั้งหมดก็ดี ข้อยกเว้นภายในบ่นว่าวัตถุนั้นเป็นโมฆะ (คลาสผู้ช่วย) สิ่งที่ฉันทำคือเพิ่มการใช้ตัวช่วยเหลือไปยัง Global.asax และแม้ว่า Global.asax จะไม่ถูกใช้งาน แต่ก็สามารถแก้ไขปัญหาได้


0

คำตอบของฉันยังเกี่ยวข้องกับส่วนกำหนดค่า หากคุณกำหนดค่าจากไฟล์กำหนดค่าที่คลาสแบบคงที่ของ C # หรือ Module.VB ของ VB คุณจะได้รับข้อผิดพลาดนี้ในเวลาทำงาน

เพิ่ม key = "LogPath" value = "~ / Error_Log /"

การใช้ Forward slash ใน Web.Config ยังนำไปสู่ข้อผิดพลาดนี้ในเวลาทำงาน ฉันเพิ่งแก้ไขปัญหานี้โดยใส่ BackSlash

เพิ่ม 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

ยังไงก็ตามที่ออกจาก Visual Studio และเปิดขึ้นมาใหม่มันแก้ปัญหานี้ให้ฉัน


0

ปุ่มพจนานุกรมควรไม่ซ้ำกัน!

ในกรณีของฉันฉันใช้พจนานุกรมและฉันพบสองรายการในนั้นมีรหัสเดียวกันโดยไม่ได้ตั้งใจ

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

0

สำคัญ: ฉันมีหลายโครงการในโซลูชันของฉันและฉันลืมเพิ่มการอ้างอิง / ไลบรารี Nuget เมื่อฉันเรียกใช้เมธอดในคลาสสแตติกซึ่งใช้ไลบรารีที่กำหนดก็มีข้อยกเว้นดังกล่าว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.