C# InitializeComponent上的WindowsForm应用程序崩溃

C# InitializeComponent上的WindowsForm应用程序崩溃,c#,windows-xp,crash,C#,Windows Xp,Crash,我相对简单的窗口应用程序似乎在到达表单构造函数中的InitializeComponent方法时就会崩溃。现在,表单显然是一个分部类,InitializeComponent调用分部类另一部分中的方法。 问题是生成了另一个分部类。我如何调试它并找出哪一行导致我的应用程序崩溃。应用程序崩溃时会出现一个错误报告对话框,其中包含非常稀疏的错误详细信息。我无法通过IDE调试应用程序,因为应用程序只会在部署计算机上崩溃,而在该计算机上加载vs2008是不可能的。请帮助。如果没有更多细节,很难给您任何具体建议

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

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

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

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

更新:

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

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);
    }

异常说明了什么?我没有得到异常,或者至少我看不到异常。我得到一个“请告诉微软这个问题”对话框。错误报告本身主要包含噪波和十六进制转储。提到的模块是mscorlib,除此之外,它在使用中的模块错误报告中只是一个巨大的数据量,以及它们的版本号等。这就是为什么我如此沮丧的原因。这里面没有什么好东西,一个是旁注。我已将表单构造函数中的所有内容包装在一个try-catch中,如下所示:try{do-stuff}catch(异常e){MessageBox.Show(e.Message)}但从未抛出异常。只有MS报告这个bla bla框。远程调试是一个选项吗?也许,必须首先扭转网络管理员的手臂不,不触发事件。遗憾的是,我不能仅仅用几个MessageBox修改分部类的InitializeComponent方法。根据我的经验,没有触发ThreadException的崩溃通常是两件事之一:要么是堆栈溢出,或者终结器中的异常。查看事件日志,它包含以下信息:EventID:5000 EventType clr20r3、P1 tombopoc.exe、P2 1.0.0.0、P3 4d468dd5、P4 mscorlib、P5 2.0.0.0、P6 4be90358、P7 20a2、P8 7、P9 N3CTRYE2KN3C34SGL4ZQYRBFTEE4M13NB、P10 NIL。有关更多信息,请参阅.Mmm上的帮助和支持中心,我假设您无法编辑生成的代码,因为每次构建都会被覆盖。根据您的更新,我尝试了一下,在InitliazeComponent中乱放了十几行MessageBox.Show(“#1”)行,最终找到了罪魁祸首:this.Icon=((System.Drawing.Icon)(resources.GetObject($this.Icon));此行试图加载图标资源。不太清楚为什么它不能加载到特定的机器上,但我只是更换了图标和bobs你叔叔,一切正常。讨厌那些浪费了3个小时的小事情???肯定不是追踪问题的首选方式,但有时你只需要用暴力来解决它。好吧,试试看。我甚至还修改了表单上的所有控件,以删除InitializeComponent部分中的代码。现在还没运气,但让我尽快尝试一下你的建议。除了错误的事件订阅之外,没有合理的失败模式。使用代码示例进行Post更新。在Program.cs main中,第一行:AppDomain.CurrentDomain.UnhandledException+=新的UnhandledExceptionEventHandler(CurrentDomain\u UnhandledException);当然还有:static void CurrentDomain_UnhandledException(对象发送方,unhandledExceptionEventTargets e){MessageBox.Show(e.ExceptionObject.ToString());}是的,这就是我所拥有的。我仍然目瞪口呆,但看看关于confusedGeek如何解决问题的答案的评论。混乱我知道,我应该有一个日志框架,但这是一个微不足道的应用程序。