我的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:MNMPictures 1.1.0MNM_Interface.exe
Faulting module path: C:MNMPictures 1.1.0more.dll
Report Id: 586ce056-dd2e-11e4-b2ce-08edb9de061e
我尝试在父和子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#应用程序中的externall dll引发的非托管代码异常。
由于这是访问违规,并且假设您没有错误的ram,您可以尝试第三方异常记录器,例如来自:www.eurekalog.com或madexcept.com
另请参阅以下类似回复:stackoverflow.com/questions/1449904/what-do-i-do-when-my-program-crashes-with-exception-0xc0000005-at-address-0
如果你的more.dll是用C写的,你也有可能有一个未初始化的指针。
另一种可能性是Windows在尝试访问受保护的内存时引发数据执行保护(DEP)错误