一个小故事: 在最近测试我们的C#(.NET 4.0)软件的安装程序时,我们成功安装了7或8台不同的机器。但是,我们的一个QA成员安装了,并且能够使应用程序始终在他的机器上崩溃。
我们的应用程序做的第一件事 - 在其他任何事情之前 - 是产生一个外部应用程序,等待它做它的事情,(稍后会详细介绍)然后退出。如果我们没有启动外部应用程序,它可以防止他的计算机崩溃。
真正奇怪的是,崩溃发生在主应用程序的后期。外部exe完成并退出后很久。为了验证它本身不是外部进程,我改为使用主应用程序启动记事本。当他退出记事本时,申请将照常恢复。这个ALSO引起了崩溃。最后,告诉外部应用程序启动“Process.UseShellExecute = false”可以防止崩溃。
//Successful code
Process myProcess = new Process();
myProcess.StartInfo.FileName = "MyProcess.exe";
myProcess.StartInfo.UseShellExecute = false;//Only difference between crashing and non-crashing code
myProcess.Start();
myProcess.WaitForExit();
...
myProcess.Dispose();
myProcess = null;
其他相关资料: 崩溃总是发生在很久以前用Delphi 5编写的导入DLL中的一次尝试方法调用。不幸的是,我不太了解这个DLL的内部工作原理,但事实上这只在这台特定的机器上失败了让我觉得这不是问题。 我们从事件查看器得到的错误是:
错误模块名称:ntdll.dll,版本:6.1.7601.22436,时间戳: 0x521eaa80异常代码:0xc0000374
(0xc0000374是堆损坏)
对我来说,这两种类型的执行会有所不同,但是这个人使用Windows Shell的机器会有什么不同会导致崩溃?