我有一个相当尴尬的情况。
我有一个小的COM公开组件(我们称之为SmallCOM),这是一个(Delphi)win32 dll,我在托管C#程序集中使用它(通过COM)。
我有一个很大的COM暴露组件(我们称之为BigCOM),这是一个(Delphi)win32 dll,我使用相同的托管c#程序集(再次通过COM)。
“滑稽”部分是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是一个服务,它是高度多线程的,它即使在BigCOM工作的时候也使用这个SmallCOM。)
所以,我的问题是:使用Isolated Reg-Free COM来隔离我的C#exe中的SmallCOM解决问题?或者BigCOM和C#exe仍然共享相同的进程,无论如何都使用相同的SmallCOM.dll?
提前致谢! 艾蒂安。
答案 0 :(得分:1)
如果是dll已被卸载(这是COM运行时将执行的操作,它不是由应用程序直接完成的)那么看起来很可能是库过早地从{{1 (假设这是DLL实现的功能)。
如果是这种情况,要么是需要修复的SmallCOM中的错误,要么是作为乐队助手使用DllCanUnloadNow
标志调用GetModuleHandleEx,这将阻止DLL被卸载。