1

Windows 8で既存のアプリケーションをテストすると、非常に奇妙なクラッシュが発生します。メインアプリケーションはDelphi XE(Win32)で記述されており、COM相互運用機能を使用して.Netアセンブリを呼び出します。現在使用されている.Netバージョンは3.5です。

アプリケーションがWindows8の新規インストールで実行されると、突然正常に実行を開始する前に、最大10回クラッシュします。OKを開始すると、引き続き実行されます。エラーログやエラーメッセージは表示されません。アプリケーションがハングするか、動作を停止します。

物理と仮想の両方で、4つの異なるWin8インストールで同じ結果が得られました。

Double.TryParse数値以外の値を解析しようとしたときに、リモートデバッグを実行し、エラーを.Netメソッドまで追跡することができました。

Double.ParseTry/Catchブロック内でも機能しません。

メインアセンブリはDelphiPrismで記述されていますが、VS2010を使用してC#で記述されたテストアセンブリでエラーを再現することができました。

.Net 4は正常に機能しているようですが、Oracleのサポートがないため、現在アップグレードできません。

このプログラムは、以前のバージョンのWindowsでも、WindowsServer2012でも問題なく動作します。

ヒントや提案をいただければ幸いです。

追加: C#/マネージコードで記述された別のテストアプリケーションから呼び出されたときに、テストアセンブリが正しく機能することを忘れました。クラッシュを引き起こすのは、Delphi(Win32)、. Net 3.5、COM InterOp、およびWindows8の組み合わせだけです。

また、最大10回クラッシュした後、アプリケーションが突然動作し始める理由にも非常に困惑しています。

4

3 に答える 3

1

コードがないとトラブルシューティングは非常に困難ですが、いくつかの推奨事項を提示できます。

実際に.Net3.5ランタイムをインストールしましたか?実際の.Net3.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ホストで実行されている場合にのみ発生するため、作成される.NETAppDomainをDelphiで制御できるかどうかを確認します。私はDelphi開発者ではないので、ここではお手伝いできませんが、コードをAppDomainにロードする方法をより細かく制御できるJCLというライブラリがあるようです。

Delphiプログラムでの.NETランタイムのホスティング

これを追跡できる場合は、Microsoftサポートと調査結果を共有して、問題に対処できる可能性があることをお勧めします(解決するのは彼らの管理下にあると想定しています)。

于 2012-10-03T14:56:53.707 に答える
0

Microsoftがこの問題を自分たちで修正したようです。WindowsUpdateで利用可能なWindows8の最新の修正プログラムをインストールすると、問題は解消されます。

于 2012-10-12T13:10:31.687 に答える
0

Delphiは、.NETで許可されていないCPUビット数を変更します。ある種のオーバーフローに対して例外をスローします。Delphi側から次のようなものを試してください。

var lSave: Word;


lSave := Get8087CW;

Set8087CW($037f);

<YOURCALLTO.NET>

Set8087CW(lSave);
于 2012-10-04T06:12:36.397 に答える