0

私はかなり厄介な状況にあります。

私は(COMを介して)マネージC#アセンブリから使用する(Delphi)win32 dllである1つの小さなCOM公開コンポーネント(SmallCOMと呼びましょう)を持っています。

(Delphi)win32 dllであり、同じマネージc#アセンブリから(COMを介して)使用する1つの大きなCOM公開コンポーネント(BigCOMと呼びましょう)があります。

そして「面白い」部分は、BigCOM もインスタンス化して、COM を介して SmallCOM を使用することです。

これはすべて同じプロセスで発生し、何らかの理由で、(windgb を使用して分析した場合) 次のことを教えてくれる、キャッチできない低レベルの例外が発生することがあります。

STACK_COMMAND:  .cxr 00000000 ; kb ; ~10s; .ecxr ; kb 

SYMBOL_STACK_INDEX:  2 

SYMBOL_NAME:  SmallCOM+178c6

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: SmallCOM 

IMAGE_NAME: SmallCOM.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  2a425e19

FAILURE_BUCKET_ID: 

NULL_CLASS_PTR_DEREFERENCE_c0000005_SmallCOM.dll!Unloaded

BUCKET_ID: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_SmallCOM+178c6

WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/C#Service_exe/2_4_0_1/4ad7147f/ntdll_dll/5_2_3790_3959/45d70ad8/c0000005/0004afb2.htm?Retriage=1

Followup: MachineOwner

BigCOM は SmallCOM との連携を完了し、それを解放したため、C# exe から再び使用することはできなくなったと思います (そして、再読み込みは論外です。exe は高度にマルチスレッド化されたサービスであり、この SmallCOM を使用します)。 BigCOM が動作している場合でも)。

だから、私の質問は次のとおりです。Isolated Reg-Free COM を使用して、C# exe で SmallCOM を分離すると問題が解決しますか? それとも、同じプロセスを共有している BigCOM と C# exe は、何があっても同じ SmallCOM.dll を使用しますか?

前もって感謝します!エティエンヌ。

4

1 に答える 1

1

dll がアンロードされている場合 (これは COM ランタイムが行うことであり、アプリケーションによって直接行われるわけではありません)、ライブラリが時期尚早に値を返している可能性がありますDllCanUnloadNow(それが DLL であると仮定します)。機能を実装しています)。

その場合は、修正が必要な SmallCOM のバグであるか、応急処置として、DLL のアンロードを停止するフラグを指定してGetModuleHandleExを呼び出します。GET_MODULE_HANDLE_EX_FLAG_PIN

于 2010-03-16T21:33:12.153 に答える