Windows窗体应用程序在InitializeComponent上崩溃

时间:2011-01-31 12:56:40

标签: c# windows-xp crash

我的相对简单的Window Application似乎在它到达窗体构造函数中的InitializeComponent方法时崩溃。现在,表单显然是一个部分类,而InitializeComponent是调用部分类的其他部分中的方法。 问题是生成了其他部分类。我如何调试它并找出导致我的应用程序崩溃的行。应用程序崩溃时出现错误报告对话框,其中包含非常稀疏的错误详细信息。我无法通过IDE调试应用程序,因为应用程序只在部署机器上崩溃,并且在该机器上加载vs2008是不可能的。请帮忙。

2 个答案:

答案 0 :(得分:1)

如果没有更多细节,很难给你任何具体的建议。

您可以向application ThreadException添加事件处理程序以捕获任何未处理的异常。在事件处理程序中,我将记录异常,堆栈跟踪以及您可能拥有的任何其他相关数据。如果您没有使用某种日志框架,那么您可以随时使用System.Diagnostics命名空间中的可用内容(以及对app.config的必要补充),以便添加一些简单的日志输出处理。

我的另一个想法是你使用的是非MS提供的UI库吗?如果是,它们是否包含在您的应用程序/安装程序中。假设您的应用程序使用了一些并且未包含它们,这可能是它在InitializeComponent调用中崩溃的原因。

更新
根据您的意见,我已经更新了我的答案。您可以向InitializeComponent方法添加代码,只需记住它生成的代码,因此编辑它确实会带来一些风险。愚蠢的问题,但你检查,以确保构造函数甚至被调用?它以您描述的方式崩溃的事实通常表明在目标机器上缺少/配置了应用程序的基本内容。您还可以检查该计算机上的Windows事件日志,看看是否为您输入了有用的内容。

答案 1 :(得分:1)

ThreadException确实在这里工作,异常是过早引发的。编写AppDomain.CurrentDomain.UnhandledException的事件处理程序,在Application.Run()和/或表单构造函数调用之前在Main()方法(Program.cs)中订阅它。在事件处理程序中记录或显示e.ExceptionObject.ToString()的值。您将获得的异常消息和堆栈跟踪几乎总是足以诊断和更正异常的原因。

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        Application.Run(new Form1());
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
        MessageBox.Show(e.ExceptionObject.ToString());
        Environment.Exit(1);
    }