加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – Windows XP和7之间发生了什么变化,导致我的Mono C#应用

发布时间:2020-12-14 04:02:26 所属栏目:Windows 来源:网络整理
导读:我使用 Linux上的Mono框架创建并编译了一个C#应用程序.该程序适用于Windows XP和Linux.然而,当我在Windows 7上启动它时,它崩溃了,没有任何有用的信息. 这两个版本的Windows之间发生了什么变化,这可能会导致这种情况发生? 源代码可在http://github.com/pstui
我使用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读