我有一个相当尴尬的情况。
我有一个小的COM公开组件(让我们称它为SmallCOM),它是一个( win32 )Delphi动态链接库,我从一个托管的C#程序集(通过COM)使用它。
我有一个很大的COM公开组件(让我们称它为BigCOM),它是一个( win32 )Delphi动态链接库,我从同一个托管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 )。
所以,我的问题是:在我的C# exe中使用Isolated Reg-Free COM来隔离SmallCOM能解决这个问题吗?或者,仍然共享相同进程的BigCOM和C# exe无论如何都会使用相同的SmallCOM.dll吗?
提前感谢!艾蒂安。
发布于 2010-03-17 05:33:12
如果已经卸载了dll (这是COM运行时要做的事情,它不是由应用程序直接完成的),那么该库似乎很可能过早地从DllCanUnloadNow返回值(假设这是DLL实现该函数)。
如果是这种情况,要么是SmallCOM中的错误需要修复,要么是作为创可贴,您可以使用GET_MODULE_HANDLE_EX_FLAG_PIN标志调用GetModuleHandleEx,该标志将停止卸载DLL。
https://stackoverflow.com/questions/2456390
复制相似问题