引用dll时System.TypeInitializationException

时间:2016-07-26 13:41:26

标签: c#

我试图以.dll的形式创建一个数据框架,这样我就可以在创建新项目时引用它,而不是重新创建我创建的每个项目的轮子。

我有一个app.config,我在其中存储我的SQL连接,一个使用app.config构建我的SQL ConnectionString(ConnectionStrings.cs)的类和一个构建的逻辑类(Logic.cs)我需要从SQL Server获取的任何对象。

这里是.dll中的类:

ConnectionStrings.cs:

using System.Configuration;
using System.Data.SqlClient;

namespace DataFramework
{
    public static class ConnectionStrings
    {
        static string _liveConnectionString = ConfigurationManager.ConnectionStrings["LiveDataSource"].ConnectionString;
        static string _liveMISConnectionString = ConfigurationManager.ConnectionStrings["LiveDataSource_MIS"].ConnectionString;
        static string _devConnectionString = ConfigurationManager.ConnectionStrings["DevDataSource"].ConnectionString;
        static string _devMISConnectionString = ConfigurationManager.ConnectionStrings["DevDataSource_MIS"].ConnectionString;

        public static SqlConnection CreateLiveConnection
    {
        get { return new SqlConnection(_liveConnectionString); }
    }

    public static SqlConnection CreateLiveMISConnection
    {
        get { return new SqlConnection(_liveMISConnectionString); }
    }

    public static SqlConnection CreateDevConnection
    {
        get { return new SqlConnection(_devConnectionString); }
    }

    public static SqlConnection CreateDevMISConnection
    {
        get { return new SqlConnection(_devMISConnectionString); }
    }
  }
}

Logic.cs:

using System;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace DataFramework
{
    public class Logic
    {

    SqlConnection liveConnection = ConnectionStrings.CreateLiveMISConnection;
    SqlConnection devMISConnection = ConnectionStrings.CreateDevMISConnection;

    public bool IsConnecting { get; set; }
    public string ConnectionMessage { get; set; }

    public async Task<DataTable> ResultDataTable(bool connectToLive, string commandText, CommandType commandType)
    {
        DataTable dt = new DataTable();
        using (SqlCommand command = new SqlCommand())
        {
            try
            {
                command.CommandType = commandType;
                command.CommandTimeout = 360000000;

                switch (connectToLive)
                {
                    case true:
                        command.CommandText = commandText;

                        command.Connection = liveConnection;

                        if (liveConnection.State == ConnectionState.Connecting)
                        {
                            IsConnecting = true;
                            ConnectionMessage = "Connecting to Data Source...";
                        }
                        if (liveConnection.State != ConnectionState.Closed)
                            liveConnection.Close();
                        if (liveConnection.State != ConnectionState.Open)
                        {
                            liveConnection.Open();
                            IsConnecting = false;
                            ConnectionMessage = "";
                        }
                        break;
                    case false:
                        command.CommandType = commandType;
                        command.CommandText = "";
                        command.Connection = devMISConnection;
                        if (devMISConnection.State == ConnectionState.Connecting)
                        {
                            IsConnecting = true;
                            ConnectionMessage = commandText;
                        }
                        if (devMISConnection.State != ConnectionState.Closed)
                            devMISConnection.Close();
                        if (devMISConnection.State != ConnectionState.Open)
                        {
                            devMISConnection.Open();
                            IsConnecting = false;
                            ConnectionMessage = "";
                        }
                        break;
                }

                using (SqlDataReader reader = await command.ExecuteReaderAsync())
                {
                    dt.Load(reader);
                }

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "An Error Has Occured", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
            }
            finally
            {
                if (devMISConnection.State != ConnectionState.Closed)
                    devMISConnection.Close();

                if (liveConnection.State != ConnectionState.Closed)
                    liveConnection.Close();
            }
        }

        return dt;

    }
}
}

我在我写的应用程序中包含此dll作为参考:

using System.Data;
using System.Threading.Tasks;
using System.Windows.Forms;
using DataFramework;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
    DataTable dt = new DataTable();
    DataFramework.Logic logic = new Logic();

    public Form1()
    {
        InitializeComponent();
    }

    private async void Form1_Load(object sender, EventArgs e)
    {
        dt = await Task.Run(() => logic.ResultDataTable(true, "SELECT * FROM MIS.dbo.ETL_Table", CommandType.StoredProcedure));
    }
}
}

代码抛出异常:

SqlConnection liveConnection = ConnectionStrings.CreateLiveMISConnection;

那么,为什么,当我初始化课程时,我是否会遇到这个问题?

1 个答案:

答案 0 :(得分:2)

当您从另一个项目引用DLL(或项目)时,将使用来自最顶层项目的app.config。因此,如果您从WinformsApp调用了DataFramework,那么您的WinformsApp需要在其中具有正确的配置设置。默认情况下,它将忽略DataFramework中的任何app.config。有时候有点令人沮丧!将您的设置从DataFramework app.config复制到WinformsApp app.config中,它将起作用。

另一个不相关的观察是你有以下几点:

"SELECT * FROM MIS.dbo.ETL_Table", CommandType.StoredProcedure

命令类型应该是文本而不是存储过程。