Windows XP和7之间发生了什么变化,导致我的Mono C#应用程序崩溃了?

时间:2011-02-26 14:37:26

标签: .net windows-7 mono windows-xp crash

我使用Linux上的Mono框架创建并编译了一个C#应用程序。该程序适用于Windows XP和Linux。但是,当我在Windows 7上启动它时,它崩溃了,没有任何有用的信息。

这两个版本的Windows之间发生了什么变化,这可能会导致这种情况发生?

源代码位于http://github.com/pstuifzand/Abacus/

更新

当我在WinDBG下运行代码时,我得到以下堆栈跟踪。

Child-SP          RetAddr           Call Site
00000000`0016de80 000007fe`f465ffb3 KERNELBASE!RaiseException+0x3d
00000000`0016df50 000007fe`f49b7477 mscorwks!StrongNameFreeBuffer+0x51a3
00000000`0016e040 000007fe`f49b9656 mscorwks!Ordinal24+0xb957
00000000`0016e070 000007fe`f4a3c525 mscorwks!Ordinal24+0xdb36
00000000`0016e0a0 000007fe`f4a3c53b mscorwks!StrongNameSignatureVerificationEx+0x2fb5
00000000`0016e110 000007fe`f4611a2a mscorwks!StrongNameSignatureVerificationEx+0x2fcb
00000000`0016e140 000007fe`f4a96b38 mscorwks!StrongNameTokenFromPublicKey+0x744fa
00000000`0016ebc0 000007fe`f4a821f2 mscorwks!PreBindAssembly+0x24978
00000000`0016ec00 000007fe`f461795a mscorwks!PreBindAssembly+0x10032
00000000`0016ecf0 000007fe`f47114f7 mscorwks!StrongNameTokenFromPublicKey+0x7a42a
00000000`0016edb0 000007ff`001f012a mscorwks!IEE+0xd8fb
00000000`0016ee80 000007fe`f4711612 0x7ff`001f012a
00000000`0016eeb0 000007fe`f463ee13 mscorwks!IEE+0xda16
00000000`0016ef00 000007fe`f4aebc51 mscorwks!CreateAssemblyNameObject+0x5cbb
00000000`0016efa0 000007fe`f4567dc7 mscorwks!PreBindAssembly+0x79a91
00000000`0016f1e0 000007fe`f4544118 mscorwks!GetCLRFunction+0xccaf
00000000`0016f440 000007fe`f4bd7e3d mscorwks+0xf4118
00000000`0016f730 000007fe`f453651b mscorwks!GetAssemblyIdentityFromFile+0x195bd
00000000`0016fd00 000007fe`f4553e60 mscorwks+0xe651b
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscoreei.dll - 
00000000`0016fd50 000007fe`f65a3309 mscorwks!CorExeMain+0xac

1 个答案:

答案 0 :(得分:8)

我的回答包含两部分。第一部分展示了在程序崩溃之前,实际启动之前如何找到问题。第二部分解释了解决崩溃问题的解决方法。

第1部分 - 为什么我的程序崩溃?

奇怪的是,我的程序适用于其他计算机和其他版本的Windows。该程序不适用于Windows 7(显然是64位)计算机。所以我的第一直觉是看旧版Windows和新版本之间的差异。然而,似乎有很多事情发生了变化,所以这是一个失败的原因。

我第二次尝试使用WinDbg找到问题,WinDbg是一个调试器,可以让您查看程序崩溃的位置。这种尝试的问题是堆栈跟踪没有指向帮助我理解问题的信息。它实际上一开始就把我指向错误的方向。我让我看看签署我的集会。然而,这不是我的问题的一部分。

第三次尝试让我看看程序内部抛出了哪个异常。我这样做是通过添加一些日志记录代码和意外的异常处理程序。

在Main方法中,我添加了以下代码:

AppDomain.CurrentDomain.UnhandledException 
    += new UnhandledExceptionEventHandler (CurrentDomain_UnhandledException);
TraceListener log = new TextWriterTraceListener ("abacus.log");
Trace.Listeners.Add (log);
Trace.Listeners.Add (new ConsoleTraceListener ());

只要未捕获到异常,就会调用异常处理程序。 Trace语句初始化各种日志记录处理程序。添加/d:TRACE以启用诊断。在类中我添加了这个方法,它打印异常内部的信息。

static void CurrentDomain_UnhandledException (object sender, UnhandledExceptionEventArgs e) {
    try {
        Exception ex = (Exception)e.ExceptionObject;

        Trace.Write ("Whoops! Please contact the developers with the following information:\n\n" + ex.Message + ex.StackTrace + ex.InnerException.Message + ex.InnerException.StackTrace);
        Trace.Flush ();
    } finally {
        Application.Quit();
    }
}

运行此增强程序会生成包含异常信息的日志消息。通过此日志消息,我找到了message,这解释了我的程序崩溃的原因。我尝试加载64位版本的程序集,这些程序集不能用作64位,只能用于32位。这就是问题所在。

第2部分 - 如何阻止我的程序崩溃?

在我的第一次尝试中,我更改了MonoDevelop中的设置,这使得它生成32位代码。这并没有解决我的问题。

在我的第二次尝试中,我下载了一个名为corflags.exe的程序,该程序包含在Windows SDK中。这个程序允许我更改一个标志,这使Windows将该程序作为32位程序运行。这解决了我的问题。

corflags.exe /32BIT+ program