【问题标题】:Error clr20r3 .NET Windows Application Visual Studio 2010错误 clr20r3 .NET Windows 应用程序 Visual Studio 2010
【发布时间】:2011-07-29 14:40:15
【问题描述】:

我们有一个使用 Visual Studio 2010 开发的基于 .NET 的 Windows 应用程序。该应用程序是使用 .NET Framework 2.0 的目标框架构建的。我们以 .NET 3.5 SP1 作为工作平台(先决条件)发布应用程序。总的来说,这个应用程序在我们的大多数客户中运行得非常好。但其中一个目前遇到了问题。应用程序不时(间歇性地)遇到致命错误并被强制关闭,除了“应用程序遇到问题需要关闭。我们对给您带来的不便,我们深表歉意。”之外没有抛出任何错误消息。我们能获得的唯一信息是来自 Windows 事件查看器。错误详情如下:

来源:.NET 运行时 2.0 错误
事件类型:clr20r3,
P1:App.exe
P2:6.0.0.0
P3:4dee1ecd
P4:system.windows.forms
P5:2.0.0.0
P6:4889dee7
P7:16cf
P8:159
P9:system.componentmodel.win32
P10:无

当应用程序崩溃时,用户正在执行不同的操作。我们设置了一个装有 Windows XP Professional 的虚拟机,这是我们客户正在使用的操作系统。在测试环境中一切都运行得很好。我们永远无法复制这个问题。

任何机构有任何想法或想法?

任何cmets都非常感谢。

【问题讨论】:

标签: .net visual-studio-2010 windows-xp


【解决方案1】:

当 Windows 窗体应用程序在消息泵之外遇到未处理的错误时,我已经在事件日志中看到了这个错误(或至少一个类似的错误,这是不久前的) - 您应该检查以确保你的Main 方法和所有后台线程都有try-catch 块,(或者你处理UnhandledException 事件):

[STAThread]
static void Main()
{
    try
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    catch (Exception ex)
    {
        // Log me
    }
}

请注意,在发布的示例中,通常不会使用上面的 catch 块,因为这些方法通常不会引发异常,但是如果您更改了 UnhandledExceptionMode 或执行任何可能在您的消息之外引发异常的事情pump 那么这可能会给你你所看到的行为。

【讨论】:

    【解决方案2】:

    不要依赖 Windows 日志。而是纠正你自己的错误;您可以做的是处理应用程序抛出的任何异常,记录它,然后重新启动应用程序:
    所以在你的主要:

    AppDomain.CurrentDomain.UnhandledException += OnCurrentDomain_UnhandledException;
    
    //Add these too if you are in windows forms application
    Application.ThreadException += OnApplication_ThreadException;
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    

    如果抛出异常只需记录它,您也可以重新启动应用程序

    private static void OnCurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
    #if DEBUG
        System.Diagnostics.Debugger.Break();//we will break here if we are in debug mode.
    #endif//DEBUG
    
        LogException(e);//maybe send email to you also.
        RestartTheApplication();    
    }
    

    【讨论】: