1

我的 c# 应用程序Process.start()用于在内部调用另一个 exe,然后调用process.waitforexit(). 子 exe 完全执行后,我收到一个带有以下消息的弹出窗口

MNM_Interface 已停止工作

问题导致程序停止正常工作。如果有可用的解决方案,Windows 将关闭该程序并通知您。

我的日志显示我的父 exe 或子 exe 中没有异常。但是,只有在子 exe 中的代码完全执行之后才会出现错误弹出窗口。Eventviewer 显示异常代码:0xc0000005

Faulting application name: MNM_Interface.exe, version: 1.0.0.0, time stamp: 0x5523d05b
Faulting module name: more.dll, version: 1.2.1.0, time stamp: 0x54e2d422
Exception code: 0xc0000005
Fault offset: 0x0040bb62
Faulting process id: 0x1870
Faulting application start time: 0x01d0713b195e7b30
Faulting application path: C:\MNM\Pictures 1.1.0\MNM_Interface.exe
Faulting module path: C:\MNM\Pictures 1.1.0\more.dll
Report Id: 586ce056-dd2e-11e4-b2ce-08edb9de061e

我尝试在父 exe 和子 exe 中使用以下代码,但无法阻止此弹出窗口的出现。

AppDomain currentDomain = AppDomain.CurrentDomain;   
currentDomain.UnhandledException += new   
    UnhandledExceptionEventHandler(DomainExceptionHandler); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

好吧,我在检查各种来源后得到的解决方案是在注册表项下方设置,并且效果很好。

HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows 错误报告 DontShowUI =1

但是我不知道如何以编程方式防止此错误出现在应用程序中。有可能吗?

我附上了用于调用子 exe 的代码。

try
        {

            if (dllPath.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                dllPath = dllPath.Remove(dllPath.Length - 1, 1);
            }
            System.Diagnostics.Process pr = new System.Diagnostics.Process();
            pr.StartInfo.UseShellExecute = true;
            pr.StartInfo.WorkingDirectory = Path.GetDirectoryName(strExe);
            pr.StartInfo.FileName = Path.GetFileName(strExe);
            pr.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            pr.StartInfo.Arguments =
                " " + strAct + " "
                + "\"" + dllPath + "\" "
                + "\"" + strProject + "\" "
                + "\"" + strUser + "\" "
                + "\"" + strPassword + "\" "
                + "\"" + strDb + "\" "
                + "\"" + strXml + "\" "
                + strModule;
            pr.Start();
            MessageBox.Show("Before process execution");
            pr.WaitForExit();
            MessageBox.Show("After process execution");
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.StackTrace);
        }

更多信息:错误模块名称:more.dll。如果我尝试使用 ildasm.exe 打开此 dll,我将得不到有效的 CLR 标头并且无法反汇编。所以我想我应该专注于如何处理由基于 CLR 的 C# 应用程序的外部 dll 引发的非托管代码异常。

4

1 回答 1

0

由于这是访问冲突,并且假设您的内存没有故障,您可以尝试使用第三方异常记录器,例如:www.eurekalog.com 或 madexcept.com

另请参阅类似的回复:stackoverflow.com/questions/14949904/what-do-i-do-when-my-program-crashes-with-exception-0xc0000005-at-address-0

如果您的 more.dll 是用 C 编写的,也有可能您有一个未初始化的指针。

另一种可能性是 Windows 在尝试访问受保护的内存时引发数据执行保护 (DEP) 错误

于 2015-04-24T05:56:28.300 回答