3

レガシ アプリケーションによって動的に読み込まれるネイティブ C DLL があります。この dll の目的は、特定のアプリケーション イベントに基づいてアプリケーションの動作をオーバーライドできるようにすることです。これらのアプリケーション イベントを強化するために、混合モードの C++/CLI dll を介してネイティブ C dll から呼び出す関数を含む C# dll があります。このアーキテクチャを使用するアプリケーションは、Windows 2000 で問題なく動作します。

アプリケーションは Windows XP でも動作しますが、アプリケーションの起動時にネイティブ C dll が読み込まれると、残念ながらアプリケーションがクラッシュします (未処理の例外)。混合モードの dll をロードしようとするとクラッシュするようです。ネイティブ C dll から混合モード dll へのすべての依存関係を削除すると、アプリケーションは正常に起動します。しかし、依存関係が追加されると、クラッシュが発生します。Windows 2000 のコードは、Windows XP で使用されているものと同じです。アプリケーション コードにはアクセスできませんが、ネイティブ C dll コードにはアクセスできますが、初期化が完了する前にクラッシュが発生するため、デバッガーを停止できません。CLR の初期化と OS ローダーの違いに関係していると思われますが、確かではありません。これを解決する方法についての提案を探しています。2を使用してVS2005を使用しています。0 フレームワーク。ご協力いただければ幸いです。

例外とスタック トレースはあまり役に立ちません。

MyApplication.exe の 0x775125f6 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x775125f6。

775125f6()  
user32.dll!7e418734()   
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]    
user32.dll!7e418816()   
user32.dll!7e428ea0()   
user32.dll!7e42ce7c()   
ntdll.dll!7c90e473()    
user32.dll!7e42e389()   

...

4

2 に答える 2

2

私はこの正確な問題を抱えていました。この質問に関する追加情報と回避策をいくつか提供しました。しかし、ここでも要約して回答を提供できることをうれしく思います。

発生している基本的な問題は、ネイティブ アプリケーションを混合モード dll およびアンマネージ dll にリンクするときに、リンカーがどのように機能するかについて、バグまたは多少のばらつきがあるように思われることです。これは、混合モードの dll とアンマネージド dll の両方がアンマネージド実行可能ファイルによってリンクされている場合にのみ発生するようです。

  • オプション 1: 混合モード dll を遅延読み込みに設定します。
  • オプション 2: CLR 対応のファイルを少なくとも 1 つ含めることにより、アンマネージ exe を混合モードの実行可能ファイルにします。ファイルは空にすることができますが、実行可能ファイルで正しくリンクできるようにするために存在する必要があります。
  • オプション 3: アンマネージ ライブラリをリンクする前に混合モード ライブラリをリンクするように、アンマネージ実行可能ファイルを更新します。

この問題を解決するためにオプション 3 を使用することになりました。これが最も安全に思えたからです。[プロジェクト プロパティ] ダイアログに移動し、[リンカ] -> [入力] タブを選択します。[追加の依存関係] フィールドで、混合モード dll の lib ファイルを指定します。混合モードのライブラリが、そのフィールドにリストされている最初のライブラリであることを確認してください。

[追加の依存関係] フィールドを次のように設定します: mixedmode.lib;unmanaged.lib;unmanaged2.lib。

これにより、管理されていないアプリケーションがクラッシュする問題が解決されたようです。unmanaged.lib が最初になるように lib の順序を並べ替えると、クラッシュに戻ることになります。

これが役立つことを願っています!

于 2012-05-23T19:45:18.053 に答える
1

シンボルが正しく設定されていないようです。最初に次のことを実行することをお勧めします。

  1. Windows 用のデバッグ ツールをインストールします http://www.microsoft.com/whdc/devtools/debugging/default.mspx
  2. コマンド プロンプトを開き、フォルダーに移動し、WinDBG -I を実行します。
  3. プログラムを実行してクラッシュさせると、WinDBG がトリガーされます
  4. タイプ .symfix
  5. タイプ .sympath+
  6. type .loadby sos clr
  7. タイプ !CLRStack -a
  8. タイプ kb

ステップ 7 と 8 により、デバッグするためのはるかに意味のあるスタックが得られるはずです。

于 2011-01-19T07:53:14.450 に答える