<转>类型初始值设定项引发异常

类型初始值设定项引发异常

连续两天都为这个运行时错误“类型初始值设定项引发异常”而烦恼,调试也不知道哪里出 了问题。上网Google一下,一大堆相同的问题,可是按照那些方法折腾来折腾去,问题还是一样。最后在CSDN上发帖子问了,果然“重赏之下必有勇 夫”,很快就有高手回复了,问题也随着解决了。哈哈。在此写个随笔,以后如果大家遇到类似问题,也可参考一下,自己也做个备忘,不然放在电脑上,又找不 到,我的电脑文件到处乱放,有时连我自己都找不到^_^。
  问题是这样嘀:
  项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这个项目也是采用分布式的数据库,目前只有三个数据库,主要出于提高访问性能考虑。
  原来是按照网上对PetShop的介绍来给各项目添加引用的。
  1、Web 引用 BLL。 
     2、BLL 引用 IDAL,Model,使用DALFactory创建实例。 
     3、IDAL 引用 Model。  
     4、Model 无引用。  
     5、DALFactory 引用IDAL,通过读取web.config里设置的程序集,加载类的实例,返回给BLL使用。  
     6、SQLServerDAL 引用 Model和IDAL,被DALFactory加载的程序集,实现接口里的方法。
    问题就出在这里了。顶!
    按照PetShop的架构,是DALFactory程序集里通过反射创建针对特定数据访问层里的对应类实例,这样BLL调用接口时就知道调用这个对应类实例里的实现方法。
 
  而反射动态加载程序集是通过这种方法
Assembly.Load("程序集").CreateInstance("命名空间.类"),其中的“程序集”读取的是Web层bin文件夹下对应的
dll,即反射加载的程序集dll在Web层的bin文件夹必须有,不然就会出现如题的错误。问题解决了~^_^
    出现这种错误的另两种情况,这也是在网上看到的,一起写下来。
    一、Web.config配置错误。
          在DALFactory程序集里的DataAccess类里,通过
          private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
          来获得程序集的名称的。
          在Web.config里我的配置如下:
          <appSettings>
          <add key="WebDAL" value="PDMS.SQLServerDAL"/>
          </appSettings>
    二、程序集名称和默认命名空间错误。
          在各个程序集右键--属性,看看程序集名称和默认命名空间有没有写错。这个问题也可能导致如题的错误~~
   
    第一次用反射,就出了这个问题,学到不少,还得加深对反射的理解^_^

类型初始值设定项引发异常

-上午打开VS编译程序的时候,突然出现了这个运行时错误“类型初始值设定项引发异常”。昨天还没有这个错误呢,今天就突然出现,搞得我一头雾水。上网搜了一下,发现有很多人遇到了这个问题。经过一番折腾解决了这个问题后,发现很多人都没有意识到其症结所在,于是写这个随笔,给大家点启发,也给自己做个备忘。

症状描述:
我的程序需要连接一台MQ服务器(其实就是个台式机,每天下班关机),如果服务器没有开,程序就会抛出异常。以前编译时老是忘开服务器,经常会出现MQ访问失败的异常。这次我原本以为也是这个异常,没想到出来的是“类型初始值设定项引发异常”。
今天的错误为什么会和以往不一样呢?昨天临下班时,把一个类的单件模式做了重构,使用了静态初始化方法。代码如下:

static readonly WorkerManager instance = new WorkerManager();
static WorkerManager() { }
private WorkerManager()
{
    Initialize();
}
public static WorkerManager Instance
{
    get { return instance; }
}

访问MQ的语句在Initialize方法里,问题就应该出现在这里了。

解决方法:
当然,把MQ服务器打开问题就解决了,但是究竟为什么会出现“类型初始值设定项引发异常”呢?
原来类的静态成员在初始化时如果出现异常,访问类的其它静态成员或对该类进行初始化都会抛出这个异常。请看下面的代码:

public class Test
    {
        public static Foo Test1 = new Foo();
        public static string Test2 = "Test2";
        public string Test3 = "Test3";
        public Test() { }
    }

    public class Foo
    {
        public Foo()
        {
            throw new Exception();
        }
    }

在访问Test.Test2以及new Test()时都会抛出这个异常。我的代码中,由于Initialize()出现异常,instance实例化失败,所以访问Instance时就抛出了这个异常。

总结:

TypeInitializationExeption在MSND中的描述为:当类初始值设定项不能初始化类型时,将创建 TypeInitializationException 并向其传递由该类型的类初始值设定项引发的异常引用。

我们知道,类型初始化或者访问类型的静态成员时,都会对类中的其他静态成员进行初始化,并执行静态构造函数(如果有的话)。在这些过程中如果任一环节出现例如下面的代码:


    class ClassHelper
    {
        public static string Field = Do("Initial the static field");
        public static string StaticString = "Initaial static string";
        public string NonStaticString = "Initial non static string";
        public ClassHelper()
        {
            NonStaticString = "Change non static string in instance constructor";
            StaticString = "Change static string in instance constructor";
        }
        public static string Do(string field)
        {
            Console.WriteLine(field);
            throw new Exception();
            return field;
        }
    }

那么产生TypeInitializationException的情况就包含以下几种:

1.
访问类的某一静态成员,而其他静态成员的初始化(或静态构造函数中)产生异常。例如访问ClassHelper.StaticString,由于静态成员
Field的初始化产生异常,因此调用ClassHelper.StaticString会抛出
TypeInitializationException。

2. 访问类的某一静态成员,该静态成员的初始化(或静态构造函数中)产生异常。例如访问ClassHelper.Field。

3. 对该类进行初始化,而类中的某个静态成员初始化(或静态构造函数中)产生异常。例如ClassHelper helper = new ClassHelper()。

时间: 2024-10-11 15:18:44

<转>类型初始值设定项引发异常的相关文章

“Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。

“Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常. 被这个问题困扰了好长时间,终于找到了原因: 原来是本机安装的Oracle客户端版本与服务器不一致. 解决办法: 将以下的dll文件引用即可,dll分为两个版本,Windows7 32位系统亲测,不管安不安装Oracle客户端,都可以使用. 版本一:http://download.csdn.net/detail/zhzhx0318/9120651 版本二:http://downloa

System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常

在一开始时将connectionStrings 写在了configSections之上如下图一示,结果抛出:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常. 图一:最初配置 图二:抛出异常 解决方法,是将connectionStrings 写在了configSections之下,如图三 图三:调整后的配置

“system.servicemodel.diagnostics.traceutility” 类型初始值设定项引发异常

在调试WCF服务时遇到“system.servicemodel.diagnostics.traceutility” 类型初始值设定项引发异常错误,仔细检查后发现是配置文件问题. ... <startup> <supportedRuntime version = "v4.0" sku =".NETFramework, Version = v4.0"/> </startup> ... 可能是因为引用服务导致NET版本不兼容.去掉这一句

c# 类型初始值设定项引发异常

今天使用VS2010编译c#程序,编译顺利通过,点击运行启动程序,弹框提示如题错误.断点调试,程序甚至都没有进入main函数!!查阅网上资料,几种分析如下(1)反射机制 (2)app.config文件格式不对  (3)程序集引用.经过判断,以上都不符合,最后发现是该64位启动工程的目标平台配的是x86,改为64位后启动成功.由于这个项目不是我自己创建的,所以本能的没有检查属性配置,在此记录,以供日后查阅,也便于帮助后来的人. c# 类型初始值设定项引发异常,布布扣,bubuko.com

“DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常

今天遇到了一个这样的问题"DBUtility.DbHelperSQL"的类型初始值设定项引发异常"DBUtility.DbHelperSQL"的类型初始值设定项引发异常 也许有和我遇到这问题的人也在这个问题怎么解决,在没有解决这个问题的时候我也和你们现在的心情一样,也百度过了,goolge过但是还是没有解决,在这个时候我们需要冷静下来想想问什么会出现这个问题 分析一下问题出现的原因,现在我来解答为什么会出现这个错误,其实很简单就是你没有配置好web连接数据库的语句,

类型初始值设定项引发异常。

今天运行之前写好的代码却提示:"_23.DBhelp"的类型初始值设定项引发异常. 后来发现是webservice更新引用时出现了重复的 <endpoint address="http://10.58.656:809/Service.asmx" binding="basicHttpBinding" bindingConfiguration="ServiceSoap" contract="WebReference

asp.net &nbsp; “Xcrs.DAL.Oracle.ProcManager”的类型初始值设定项引发异常

今天在本机上调试asp.net程序,总是报错说:"Xcrs.DAL.Oracle.ProcMana常ger"的类型初始值设定项引发异常,而且昨天还好好的,今天就报错了.然后就问同事,从网上找,各种试,但是就是找不到原因,以为是引用oracle的dll版本不匹配问题,又重新引用,但是还是报这个错.又各种检查app.config和web.config,还是报错.实在没办法了,然后就一点点调试,发现是取数据的时候,会报这个错,然后无意看到xml文件的末尾,是昨天走的匆忙,复制过去到调用的方法

水晶报表异常“CrystalDecisions.ReportSource.ReportSourceFactory”的类型初始值设定项引发异常,未能加载文件或程序集“log4net

System.TypeInitializationException: “CrystalDecisions.ReportSource.ReportSourceFactory”的类型初始值设定项引发异常. ---> System.TypeInitializationException: “CrystalDecisions.Shared.SharedUtils”的类型初始值设定项引发异常. ---> System.IO.FileNotFoundException: 未能加载文件或程序集“log4n

【转】类型初始值设定项引发异常的解决办法

类型初始值设定项引发异常的解决办法 转自:小羊快跑1  http://www.cnblogs.com/SheepRunning/p/4452847.html 今天在调试代码的时候突然抛出了如下异常:"XORM.Database"的类型初始值设定项引发异常. 顿时感觉很突兀,平常的时候一点问题没有,为什么今天调试就出问题了呢?测试了一下,发现在数据处理层的一条实例化代码处出错: //获取类型的映射信息 MappingInfo mapInfo = xmlMapping.GetDataMap