【发布时间】:2018-05-09 10:28:04
【问题描述】:
我使用以下代码创建了应用程序(仅用于研究目的):
using System;
using System.CodeDom;
using System.Linq;
using System.Reflection;
using System.Security.Permissions;
namespace HelloWorld
{
public class Program
{
static Program()
{
throw new Exception("Here we are");
}
static void Main(string[] args)
{
Console.WriteLine("Hello, world!");
}
}
}
我希望在调用Main() 方法之前在这里会出现TypeInitializationException 异常,因为静态ctor 只能在第一次调用此类的任何成员之前调用一次。
因此,在这种情况下,CLR 必须为 Program 类调用静态 ctor,然后必须调用 Main() 方法。
但这里有一件奇怪的事情:这个异常是从Main() 抛出的。但为什么?我们应该有另一个地方的异常,因为 Main 不能被调用。
这里是异常信息:
未处理的异常:System.TypeInitializationException:“HelloWorld.Program”的类型初始化程序引发了异常。 ---> System.Exception:我们在这里 在 D:\research\HelloWorld\Program.cs:line 13 中的 HelloWorld.Program..cctor() --- 内部异常堆栈跟踪结束 --- 在 HelloWorld.Program.Main(String[] args)
更新:
我有这条消息。
很遗憾,在此异常之后我无法调试应用程序。
【问题讨论】:
-
只是一个猜测,但我认为它只在需要时调用构造函数。第一次需要该类是在调用 Main 时,所以我认为这是构造函数调用的触发器,也许这就是它说在 Main 上引发异常的原因。
-
您能否编辑您的问题以包含您的 Program.cs 文件的完整源代码?您的代码块只有 12 行,但错误消息提到第 13 行。不要编辑错误消息或堆栈跟踪。
-
如果您在抛出异常后尝试调试,则会收到有趣的消息。
Your app has entered a break state, but no code is currently executing that is supported by the selected debug engine (e.g. only native runtime code is executing) -
@Progman 行号是cs文件中的实际行号。所以如果你放 100 个空行并在第 100 行抛出异常,它将是第 100 行。它在这里并不重要。
-
@M.kazemAkhgary,在抛出此异常之前的构造函数中,我在调用堆栈中只看到了我的 ctor 和 [ExternalCode]。但是,如果我用静态 ctor 定义另一个类,我会看到这样的调用堆栈: 3. static ctor(); 2.【外码】; 1. 主要()。 CLR 有调用静态 ctor 的内部机制,但我不知道为什么它在 Main() 实际上还没有执行时将 Main() 设置为调用堆栈的头部。