System.TypeInitializationException

时间:2010-08-20 22:29:23

标签: c# infopath

我正在编写测试以测试Infopath Forms在Form Control中打开,我的测试方法是

[TestMethod]
public void Validate_OpenInfopathInFormControl()
{
    Helper.OpenForm();
    //Other Code    
}

我写过Helper类

public class Helper
{  
    public static void OpenForm()
    {
        //Code to Open Form
    }
}

但每次执行此代码时,都会给我:

  

测试方法   InfoPathTest.TestAPI.Validate_OpenInfopathInFormControl   抛出异常:   System.TypeInitializationException:   类型初始值设定项   'InfoPathTest.Helpers.Helper'扔了一个   例外。 --->   System.NullReferenceException:Object   引用未设置为的实例   对象..

当我尝试调试时,当Helper类需要初始化时失败。这真的是在吃我的脑袋,对此有什么解决方法吗?

这是完整的助手类:

namespace InfoPathTest.Helpers
{
    public class Helper
    {
    //This is the form i need to OPEN
        private static MainForm f =  new MainForm();
        private static bool _isOpen = false;

        public static bool isOpen
        {
            set { _isOpen = value; }
            get { return _isOpen; }
        }

        public static void OpenForm()
        {
            try
            {
                f.Show();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            _isOpen = true;

        }

        public static void CloseForm()
        {
            f.Hide();
        }
    }
}

3 个答案:

答案 0 :(得分:6)

您的测试调用Helper.OpenForm()并且由于您没有静态构造函数,我唯一可以看到会导致抛出异常的是:

private static MainForm f =  new MainForm();

因此,MainForm的构造函数中的某些内容可能会引发异常。在MainForm的构造函数的 first 行上放置一个断点,然后逐步执行,直到看到抛出异常的位置。

另外,您可能会发现更容易确定问题所在,至少在最初阶段,通过编写新测试,您可以直接执行调用new MainForm()

[TestMethod]
public void Validate_OpenInfopathInFormControl()
{
    var form = new MainForm();
}

在测试的唯一一行放置断点并进入构造函数以确定它为什么抛出NullReferenceException

答案 1 :(得分:3)

在这种情况下,类型初始化器是初始化静态字段的位置;也就是说,这两行:

private static MainForm f =  new MainForm();
private static bool _isOpen = false;

bool的初始化不会导致任何类型的异常,因此错误的来源极有可能在MainForm构造函数中。

TypeInitializationException对象是否包含任何内部异常?如果是这样,他们应该给你更多关于错误的真正原因的信息。

答案 2 :(得分:2)

静态构造函数中有一个错误(它们被称为Type Initializers)。内部异常是NullReference异常。如果您发布代码,我们可能会帮助您。

规则确定何时运行类型初始化程序很复杂,但保证在以任何方式访问类型之前运行它们。您可能没有直接明白在Helper类上有类型初始值设定项,因为您可能使用隐式初始化:

public class Helper
{   
    static int i = 10; // This assignment will end up in a type initializer
    static Helper()
    {
        // Explicit type initializer
        // The compiler will make sure both, implicit and explicit initializations are run
    }
}