Trình khởi tạo kiểu cho 'MyClass' đã tạo ra một ngoại lệ


217

Sau đây là mã dịch vụ Windows của tôi. Khi tôi gỡ lỗi mã, tôi gặp lỗi / ngoại lệ:

Trình khởi tạo loại cho 'CSMessageUtility.CSDetails' đã ném một ngoại lệ.

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
Kiểm tra khởi tạo các thành viên tĩnh.
Robino

Câu trả lời:


350

Kiểm tra InnerExceptiontài sản của TypeInitializationException; nó có khả năng chứa thông tin về vấn đề tiềm ẩn và chính xác nơi nó xảy ra.


4
cảm ơn Fredrik Mörk tôi đã có ngoại lệ bên trong "Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng." tôi đang kiểm tra nó
gofor.net

2
@ gofor.net: như @Jackson Pope chỉ ra; phần thú vị của mã của bạn là phương thức static CSDetailstrong lớp CSMessageUtility.CSDetails(và bất kỳ phương thức nào nó có thể gọi). Nếu bạn không tự mình tìm ra vấn đề, hãy cập nhật câu hỏi với mã đó.
Fredrik Mörk

Trên thực tế CSMessageUtility là tài liệu tham khảo dll tôi đang sử dụng và điều này có chứa một số phương thức. nhưng khi tôi kiểm tra các phương thức đó một cách thủ công tôi đã không gặp phải bất kỳ lỗi nào. Nó hoạt động hoàn hảo
gofor.net

2
Ngoại lệ không phải lúc nào cũng hợp lệ hoặc chỉ ra vấn đề đúng. Đối với tôi, nó đã cố gắng cho tôi The input is not a valid Base-64 string as it contains a non-base 64 characterbiết hàm nào đang trả về đối tượng DataTable, nhưng đối với tôi, thực sự có một vấn đề tiềm ẩn khi tôi gọi một app.configtham số bằng tên sai, vì vậy một biến tôi đang sử dụng để tạo chuỗi kết nối của mình là vô giá trị Do đó, nó không thể mở OracleConnectionhàm trong đó để trả về DataTable. Lời khuyên tốt nhất là đi sâu vào chức năng cơ bản đang trả về lỗi.
vapcguy

186

Vấn đề này có thể được gây ra nếu một lớp cố gắng lấy giá trị của khóa trong web.config hoặc app.config không có ở đó.

ví dụ:
lớp có một biến tĩnh

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

Nhưng web.config không chứa GoogleCalendarApplicationClientIDkhóa

Lỗi sẽ được ném vào bất kỳ lệnh gọi hàm tĩnh hoặc bất kỳ tạo cá thể lớp nào


24
Người đàn ông tôi sẽ không bao giờ tìm thấy điều đó một mình. Tôi đã phụ thuộc quá nhiều vào việc phá vỡ điểm và, than ôi, họ sẽ không cứu tôi. Cảm ơn nụ! +1
Lukas

7
Tôi đồng ý . . . Tôi chỉ có điều tương tự chính xác xảy ra. Đang kéo tóc tôi ra để cố gắng tìm ra nó. Cảm ơn nhiều!
dscarr

3
đó là chuỗi kết nối trong trường hợp của tôi.
Musakkhir Sayyed

1
Người đàn ông đá! bạn là một vị cứu tinh Dự án được tham chiếu thậm chí không gỡ lỗi (bước vào) mà không có mục cấu hình bị thiếu. Không có manh mối liên quan đến vấn đề với config mà không đi sâu vào mã đó. Bạn đã lưu tuần của tôi sau khi tôi lãng phí 2 ngày: P!
Pramod Sharma

1
@MuhammadWaqasIqbal Câu in đậm cuối cùng đó là chìa khóa !!! BẤT K function chức năng nào sử dụng ClientIDtrong ví dụ này sẽ có lỗi này. Bài đăng tuyệt vời.
vapcguy

57

The type initializer for 'CSMessageUtility.CSDetails' threw an exception. có nghĩa là hàm tạo tĩnh trên lớp đó đã ném Ngoại lệ - vì vậy bạn cần tìm trong hàm tạo tĩnh của lớp CSDetails hoặc khởi tạo bất kỳ thành viên tĩnh nào của lớp đó.


1
Đảm bảo đủ. Tôi đã tạo một phiên bản tĩnh của logger log4net gây ra sự cố. Vấn đề là phiên bản lắp ráp log4net trong dự án đó không khớp với phiên bản trong các dự án khác (mà tôi chỉ chú ý là shivan đã chỉ ra cụ thể.)
goku_da_master

1
Tôi đã có cùng một vấn đề bằng cách sử dụng NLog. Tôi có xu hướng khởi tạo logger của mình trong các hàm tạo tĩnh và sự không khớp giữa các phiên bản trong các dự án khác nhau gây ra vấn đề. sử dụng cùng một phiên bản ở khắp mọi nơi giải quyết vấn đề.
Shelbypereira

5

Tôi gặp vấn đề tương tự, khi tôi đang sử dụng một phương thức tĩnh trong lớp Util, giống như bạn đã sử dụng 'CSMessageUtility.CSDetails'.

Vấn đề là trong quá trình khởi tạo tĩnh của lớp (sử dụng hàm tạo tĩnh), khung công tác cũng khởi tạo các biến tĩnh (các trường) trong lớp. Tôi đã có một biến tĩnh cố gắng đọc các giá trị từ app.config và app.config bị thiếu các cài đặt tương ứng, do đó dẫn đến một ngoại lệ không được xử lý. Điều này dẫn đến việc nhận được "Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng." như ngoại lệ bên trong.


3

Một điều khác để kiểm tra khi các lỗi khởi tạo này được đưa ra là kiểm tra xem phiên bản .NET đích có được cài đặt trên máy chủ không. Bạn có thể nhấp chuột phải vào dự án và xem phiên bản .NET mà ứng dụng đang nhắm mục tiêu.


3

Tôi đã gặp cùng một vấn đề do có hai thuộc tính cấu hình giống nhau (khớp với app.config):

    [ConfigurationProperty("TransferTimeValidity")]

2

Một kịch bản khác có thể gây ra điều này là khi bạn có một đoạn mã gọi:

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

Hãy nhớ rằng bạn phải sử dụng OWSTIMER.EXE.CONFIGtệp để cài đặt tệp cấu hình. Tôi đã có một App.configtập tin mà tôi đang cố đọc và tôi đã gặp phải lỗi này bởi vì ngay lập tức trong trường hợp công việc của tôi, tôi đã có một dòng trong mã của tôi đề cập đến Connfiguration.AppSettings& Configuration.ConnectionStrings. Chỉ cần chắc chắn rằng bạn đi theo con đường:

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

và đặt các thiết lập cấu hình của bạn trong OWSTIMER.EXE.CONFIGtập tin.


2

Điều này có thể xảy ra nếu bạn có một thuộc tính phụ thuộc được đăng ký sai loại chủ sở hữu (đối số ownType).

Thông báo SomeOtherControl cần phải có được 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

Nếu vì bất kỳ lý do gì, nguồn điện bị hỏng hoặc Visual Studio IDE gặp sự cố, nó có thể gây ra sự cố này bên trong thùng / gỡ lỗi / phát hành ...

Chỉ cần xóa nội dung và biên dịch lại (từ kinh nghiệm cá nhân khi ngón chân của tôi nhấn nút đặt lại!)


1

Tôi đã có một cấu hình khác nhau nhưng vẫn liên quan.

Có thể là một phần cấu hình tùy chỉnh chưa được khai báo trong configSections .

Chỉ cần khai báo phần và lỗi sẽ tự giải quyết.


1

Tôi gặp phải vấn đề này do sự không phù hợp giữa các phiên bản thời gian chạy của các hội đồng. Vui lòng xác minh các phiên bản thời gian chạy của lắp ráp chính (ứng dụng gọi điện) và lắp ráp được giới thiệu


1

Như Lỗi cho biết việc khởi tạo Loại / Lớp không thành công. Điều này thường xảy ra khi có một số ngoại lệ trong hàm tạo của lớp. Lý do phổ biến nhất là bạn gán một số giá trị trong hàm tạo đọc từ tệp cấu hình và tệp cấu hình bị thiếu các giá trị đó.


0

Trong trường hợp của tôi, tôi đã thất bại với Logger. Tạo trong thư viện lớp đang được sử dụng bởi ứng dụng (bảng điều khiển) chính của tôi. Vấn đề là tôi đã quên thêm một tham chiếu đến NLog.dll trong ứng dụng bảng điều khiển của mình. Thêm tham chiếu với phiên bản thư viện .NET Framework chính xác đã khắc phục sự cố.


0

Có một trường hợp như thế này trong một dự án WPF. Vấn đề của tôi là trên một dòng đã đi như thế này:

DataTable myTable = FillTable(strMySqlQuery);

Trường hợp FillTable()trả về một DataTable dựa trên chuỗi truy vấn SQL. Nếu tôi đã thực hiện tùy chọn "sao chép ngoại lệ vào clipboard", tôi nghĩ rằng nó đã được dán vào Notepad, tôi có thể thấy thông báo. Đối với tôi, nó làThe input is not a valid Base-64 string as it contains a non-base 64 character .

Vấn đề thực sự của tôi không phải là chuỗi truy vấn có thứ gì đó không nên ở đó, như tôi đang nghĩ, bởi vì đó string strMySqlQuery = "SELECT * FROM My_Table"là chuỗi của tôi và nghĩ đó có thể là *hoặc _, nhưng vấn đề thực sự nằm ở FillTable()chỗ tôi có một cuộc gọi đến người khác Hàm, GetConnection()đã trả về một OracleConnectionđối tượng, để mở nó và truy xuất và trả về DataTable. Bên trong GetConnection()tôi đang nhận được các app.configtham số cho chuỗi kết nối của mình và tôi có một trong số chúng được đặt tên sai, vì vậy nó đang đặt giá trị null cho mật khẩu của tài khoản dịch vụ và không tạo kết nối DB. Vì vậy, không phải lúc nào lỗi cũng chính xác cho mọi trường hợp. Tốt nhất để đi sâu vào chức năng có lỗi và gỡ lỗi từng bước và đảm bảo tất cả các giá trị được lấp đầy với những gì bạn mong đợi.


0

Tôi cũng phải đối mặt với lỗi này trong hai tình huống

  1. Trong khi thực hiện chuyển hướng từ lớp BAL sang lớp DAL, tôi đã gặp phải ngoại lệ này. Ngoại lệ bên trong nói rằng "Lỗi tham chiếu đối tượng".

  2. Web.Config khóa tập tin không khớp.

Hy vọng điều này hữu ích để giải quyết vấn đề của bạn.


0

Tương tự như những gì Muhammad Iqbal nói .. Tôi đang ở trong một VB.NET (cũng có thể là C #) dự án mà tôi đã loại bỏ một cặp khóa-giá trị từ App.configđược tham chiếu bởi một biến toàn cầu với Sub Main()các Module Main. Do đó, ngoại lệ (và phá vỡ) xảy ra Module Maintrước Sub Main(). Nếu chỉ có tôi có một điểm dừng trên Dim, nhưng chúng ta thường không phá vỡ các biến toàn cầu. Có lẽ một lý do tốt để không tuyên bố toàn cầu tham chiếu App.config? Nói cách khác, đây ...

Một ngoại lệ chưa được xử lý của loại 'System.TypeInitializationException' đã xảy ra trong Mô-đun không xác định. Kiểu khởi tạo cho 'Namespace.Main' đã tạo ra một ngoại lệ.

Được gây ra bởi ...

Ứng dụng

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

Mô-đun chính

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

    Sub Main()

        // main code

    End Main
End Module

0

Trong trường hợp của tôi, tôi có một lớp trợ giúp là tĩnh. Trong lớp đó là một phương thức để khởi tạo SqlCommand phụ thuộc vào các biến. Vì điều này đã được gọi ở một số nơi, tôi đã chuyển nó sang lớp người trợ giúp và được gọi là cần thiết, vì vậy phương thức này cũng là tĩnh. Bây giờ tôi đã có một thuộc tính toàn cầu là chuỗi kết nối trong Global.asax trỏ đến chuỗi kết nối trong web.config. Thỉnh thoảng tôi sẽ nhận được "Trình khởi tạo kiểu cho 'Người trợ giúp' đã ném một ngoại lệ". Nếu tôi chuyển phương thức từ lớp Helper sang lớp mà nó được gọi từ tất cả thì tốt. Ngoại lệ bên trong phàn nàn về đối tượng là null (lớp Helper). Những gì tôi đã làm là thêm Sử dụng Trình trợ giúp vào Global.asax và mặc dù nó không được Global.asax sử dụng nhưng điều này đã giải quyết được vấn đề.


0

Câu trả lời của tôi cũng liên quan đến phần Cấu hình. Nếu bạn gán giá trị từ tệp Cấu hình ở lớp tĩnh của C # hoặc Module.VB của VB, bạn sẽ gặp lỗi này khi chạy.

thêm khóa = "LogPath" value = "~ / Error_Log /"

Sử dụng dấu gạch chéo trong Web.Config cũng dẫn đến lỗi này trong thời gian chạy. Tôi chỉ giải quyết vấn đề này bằng cách đặt BackSlash

thêm khóa = "LogPath" value = "~ \ Error_Log \"


0

Tôi đã bọc dòng của mình bị rơi trong một khối thử, in ra ngoại lệ và bị hỏng ngay sau khi nó được in. Thông tin ngoại lệ hiển thị có dấu vết ngăn xếp chỉ cho tôi tệp và dòng mã gây ra lỗi.

nhập mô tả hình ảnh ở đây

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

Bằng cách nào đó thoát khỏi Visual Studio và mở lại nó đã giải quyết điều này cho tôi.


0

Phím từ điển phải là duy nhất!

Trong trường hợp của tôi, tôi đang sử dụng một Từ điển và tôi thấy hai mục trong đó vô tình có cùng một khóa.

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

0

Đáng chú ý: Tôi đã có nhiều dự án trong giải pháp của mình và tôi quên thêm các thư viện tham khảo / Nuget. Khi tôi chạy một phương thức trong lớp tĩnh, sử dụng các thư viện đã cho, nó đã ném ngoại lệ được đề cập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.