隔离(Reg Free)COM组件行为

时间:2010-03-16 16:54:22

标签: c# com regfreecom

我有一个相当尴尬的情况。

我有一个小的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?

提前致谢! 艾蒂安。

1 个答案:

答案 0 :(得分:1)

如果是dll已被卸载(这是COM运行时将执行的操作,它不是由应用程序直接完成的)那么看起来很可能是库过早地从{{1 (假设这是DLL实现的功能)。

如果是这种情况,要么是需要修复的SmallCOM中的错误,要么是作为乐队助手使用DllCanUnloadNow标志调用GetModuleHandleEx,这将阻止DLL被卸载。