我的应用程序适用于我的计算机。但另一个用户(也可以在他的机器上使用它)说它在服务器机器上对他不起作用。但服务器只是说“程序名称已停止工作”。有一个“查看问题详细信息”命令,但它没有告诉我足够的信息:
Problem signature:
Problem Event Name: CLR20r3
Problem Signature 01: programname.exe
Problem Signature 02: 0.0.0.0
Problem Signature 03: 4e20a786
Problem Signature 04: mscorlib
Problem Signature 05: 2.0.0.0
Problem Signature 06: 4d8c1599
Problem Signature 07: f9b
Problem Signature 08: 80
Problem Signature 09: System.IO.FileNotFoundException
OS Version: 6.1.7600.2.0.0.16.7
Locale ID: 1033
Main()
的第一行安装了一个“未处理的异常处理程序”,它应该显示一个带有堆栈跟踪的窗口。它一直运作到现在。
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
Application.ThreadException += ShowUnhandledException;
有什么方法可以获得一个调用堆栈吗?附:我需要在接下来的一个小时内完成;)
答案 0 :(得分:3)
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
仅捕获并显示由于在UI线程上运行的事件处理程序而发生的异常。它不能替代AppDomain.CurrentDomain.UnhandledException,即代码在工作线程崩溃时运行的事件。
但是你发布的跟踪为另一个问题提供了一些可能性:你的代码在开始之前可能会崩溃。 System.IO.FileNotFoundException是在您未确保客户端计算机上安装了正确版本的.NET时引发的异常。使用安装和部署项目轻松处理。或者让您的朋友启用Windows Update。
答案 1 :(得分:1)
创建一个新项目。添加对实际项目的引用。在您的应用程序中,您可以使用Assembly.Load(“..”)方法加载其他项目,这可以在try..catch块中完成。由于CLR会进行JIT编译,因此您的新应用程序应该启动(除非出现问题不是特定于所讨论的特定应用程序,而是与您的默认项目设置有关)并且在它启动后它应该能够捕获任何导致另一个失败的堆栈跟踪。以某种方式捕获此文件(文件,电子邮件,数据库)并让其他用户获得此输出。
至少这是我的理论。我没有任何程序不会开始测试这个。至少不是你给出的时间范围。
PS ==>如果您的包装应用程序无法启动,请尝试创建一个简单的“Hello world”控制台应用程序,看看是否会启动。尝试针对不同的.NET框架。创建几个这样的小应用程序来测试不同的设置。也许您的目标是64位平台,服务器是32位?
编辑:不确定如何使这项工作,因为当您将项目引用添加到可执行的程序集时,它似乎不会创建带有第二个程序集的构建的.exe文件。所以看起来你只需要从其他安装中加载来自文件系统的可执行文件......
答案 2 :(得分:1)
原来我的安装程序(MSI)在某些时候被破坏了,并且没有包含我的程序使用的7个DLL中的2个。
仍然不清楚为什么ThreadException处理程序不起作用(.NET应该调用Main(),即使DLL丢失了,因为.NET按需加载依赖项,而AFAIK只有UI线程正在运行;但是因为它已经修复了,所以没有进一步调查。)