メイン アプリケーション セグメントがアンマネージド MFC であり、マネージド (C# DLL) とアンマネージド コード間の通信を橋渡しする /clr フラグでコンパイルされた C++ DLL を呼び出すように、レガシ混合 (マネージド DLL とアンマネージド DLL) アプリケーションを再編成しています。 . 残念ながら、私の変更により、アプリケーションの InitInstance() が呼び出される前にアクセス違反が発生しました。これにより、デバッグが非常に困難になります。私が得る唯一の情報は、次のスタック トレースです。
> 64006108()
ntdll.dll!_ZwCreateMutant@16() + 0xc bytes
kernel32.dll!_CreateMutexW@12() + 0x7a bytes
だから、ここに私が試したいくつかのシナリオがあります。
- Exceptions->Win32 Exceptions->c0000005 Access Violation をオンにして、Thrown 時にブレークします。私が得る最も詳細は、上記のスタックトレースからのものです。F10 でアプリケーションを試してみましたが、ブレークポイントに到達する前に失敗し、上記のスタック トレースで失敗します。
- ブリッジ DLL をスタブ化して、bool を返すメソッドが 1 つだけになるようにし、そのメソッドが false を返すようにコーディングしました (C# コードは呼び出されません)。
bool DllPassthrough::IsFailed() { return false; }
スタブ化された DLL が /clr フラグを使用してコンパイルされている場合、アプリケーションは失敗します。/clr フラグを指定せずにコンパイルすると、アプリケーションが実行されます。
- マルチドキュメント アプリケーション用の Visual Studio ウィザードを使用してスタブ MFC アプリケーションを作成し、DllPassthrough::IsFailed() を呼び出しました。これは、DLL のコンパイルに /clr フラグを使用しても成功します。 - 次のメモAccess violation when using c++/cli
で概説されているように、winmm.lib で手動 LoadLibrary を実行しようとしました。アプリケーションはまだ失敗します。
それで、私の質問は問題を解決する方法ですか?ヒント、戦略、または以前の事件。それに失敗した場合、アクセス例外の原因となっているコード セグメントまたはライブラリに関する詳細情報を取得するにはどうすればよいでしょうか? LoadLibrary 呼び出しを行うなど、より複雑な回避策を試す場合は、失敗したライブラリに絞り込みたいと思います。
ありがとう。ところで、私たちは Visual Studio 2008 を使用しており、プロジェクトはマネージ セクションの .NET 2.0 フレームワークに対してビルドされています。