.net – Windows XP和7之间发生了什么变化,导致我的Mono C#应用
我使用
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:WindowsMicrosoft.NETFramework64v4.0.30319mscoreei.dll - 00000000`0016fd50 000007fe`f65a3309 mscorwks!CorExeMain+0xac 解决方法
我的回答包含两部分.第一部分展示了在程序崩溃之前,实际启动之前如何找到问题.第二部分解释了解决崩溃的问题.
第1部分 – 为什么我的程序崩溃了? 奇怪的是,我的程序适用于其他计算机和其他版本的Windows.该程序不适用于Windows 7(显然是64位)计算机.所以我的第一直觉是看旧版Windows和新版本之间的差异.然而,似乎有许多事情发生了变化,所以这是一个失败的原因. 我第二次尝试找到问题使用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:nn" + 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 适用于Windows 8的WPF性能监视器
- windows-server-2012-r2 – 将GPO备份导入其他域失败,并显示
- xaml – 如何摆脱Button的额外余量?
- Anaconda 安装 TensorFlow ImportError:DLL加载失败,错误
- windows-phone-8 – 如何在Windows Phone 8真实设备上设置假
- windows – 由于权限被拒绝,无法绑定到某些端口
- api – Windows Phone应用程序中的捐赠
- windows-server-2008 – 监控出站DNS(网站)流量
- windows-installer – 我可以在ARPCONTACT属性中显示URL链接
- 尝试从Windows中的Docker访问USB设备