1

在 Windows 8 中测试现有应用程序时,我遇到了一个非常奇怪的崩溃。主应用程序是用 Delphi XE (Win32) 编写的,它使用 COM 互操作对 .Net 程序集进行了一些调用。当前使用的 .Net 版本是 3.5。

当应用程序在全新安装的 Windows 8 上执行时,它会在突然开始正常运行之前崩溃多达 10 次。一旦它开始正常运行,它将继续这样做。不显示错误日志或错误消息。应用程序只是挂起或停止工作。

我在 4 种不同的 Win8 安装(物理和虚拟)上得到了相同的结果。

Double.TryParse在尝试解析非数字值时,我已经能够进行一些远程调试并设法将错误追踪到 .Net 方法。

Double.Parse在 Try/Catch 块中也不起作用。

主要程序集是用 Delphi Prism 编写的,但我已经能够使用 VS2010 用 C# 编写的测试程序集重现错误。

.Net 4 似乎工作正常,但由于缺少对 Oracle 的支持,我们现在无法升级。

该程序在以前版本的 Windows 以及 Windows Server 2012 上运行良好。

任何提示或建议将不胜感激。

另外: 当从另一个用 C#/托管代码编写的测试应用程序调用测试程序集时,我忘了提及该测试程序集可以正常工作。只有 Delphi (Win32)、.Net 3.5、COM InterOp 和 Windows 8 的组合会导致崩溃。

我也很困惑为什么应用程序在崩溃多达 10 次后突然开始工作。

4

3 回答 3

1

如果没有您的代码,将很难进行故障排除,但我可以提出一些建议。

您是否实际安装了 .Net 3.5 运行时?运行真正的 .Net 3.5 运行时和在 .NET 4.0(预装在 Windows 8 中)下“模拟”它之间存在一些差异。

接下来,您可以尝试通过创建/修改程序集清单来强制应用程序在特定运行时版本下运行。

强制应用程序在特定的 .NET 运行时版本下运行?

最后,您可以尝试强制您的应用程序进入 32 位空间,以查看 64 位是否存在问题。不幸的是,这是由进程控制的,不能由 DLL 更改。.NET 可执行文件可以在项目属性中或通过编译器标志指定:

http://msdn.microsoft.com/en-us/library/zekwfyz4(VS.80).aspx

由于仅当 .NET 代码在 Delphi .NET 主机下运行时才会发生这种情况,所以我想看看您是否在 Delphi 中对所创建的 .NET AppDomain 有任何控制权。我不是 Delphi 开发人员,所以在这里我无法为您提供帮助,但看起来有一个名为 JCL 的库可以让您更好地控制代码如何加载到 AppDomain 中。

在 Delphi 程序中托管 .NET 运行时

如果您能够追查到这一点,我建议您与 Microsoft 支持人员分享您的发现,以便他们能够潜在地解决它(假设它在他们的控制范围内以解决)。

于 2012-10-03T14:56:53.707 回答
0

Delphi changes the CPU bitness which .NET does not allow. It throws exceptions for overflows of some kind. Try something like this from the Delphi side:

var lSave: Word;


lSave := Get8087CW;

Set8087CW($037f);

<YOURCALLTO.NET>

Set8087CW(lSave);
于 2012-10-04T06:12:36.397 回答
0

微软似乎已经自己解决了这个问题。如果您安装 Windows Update 上可用的 Windows 8 的最新修复程序,问题就消失了。

于 2012-10-12T13:10:31.687 回答