我的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中使用以下代码,但无法阻止此弹出窗口的到来。
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抛出的非托管代码异常。
答案 0 :(得分:0)
由于它是访问冲突,并且假设您没有错误的ram,您可以尝试第三方异常记录器,例如: 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)错误