CoCreateInstance
创建一个COM对象(从本机代码):
const CLASS_GP2010: TGUID = "{DC55D96D-2D44-4697-9165-25D790DD8593}"; hr = CoCreateInstance(CLASS_GP2010,nil,CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,IUnknown,out unk);
其实我在Delphi,这意味着我称之为帮助函数:
CreateComObject(CLASS_GP2010);
大部分时间该功能成功。但有时,在同一个可执行文件中,在同一个进程中,对CoCreateInstance的调用失败:
Unspecified error (0x80004005 = E_FAIL)
再次调用该功能可能会成功或可能失败。没有(明显的)押韵或理由。
这不是我的COM dll
如果这是我写的一个正常的COM DLL,我将开始在DLL_ATTACH中放置OutputDebugString,当有人尝试调用DllGetClassObject时,我会确认COM正确加载我的DLL,并且正确地要求一个类被实例化。
不幸的是,它不是COM dll;它是一个.NET程序集dll。而COM子系统does not simply“加载”我的DLL。而是指示COM加载mscoree.dll:
HKEY_CLASSES_ROOT CLSID {DC55D96D-2D44-4697-9165-25D790DD8593} InprocServer32 @default = mscoree.dll
而mscoree.dll导出所需的GetClassObject函数。所以mscoree.dll是返回E_FAIL的,而不是我。我的开发机器不会发生故障,但在客户机器上始终会发生故障。
如何启用.NET日志记录?
问题是,由于mscoree.dll是返回E_FAIL的(而不是任何有用的):我如何告诉我问题是什么?
例如,似乎唯一遇到失败的客户(除了是唯一一个使用COM对象的人)恰好在Windows XP上。也许他们在.NET框架(版本4之前)遇到已知错误,您在哪里cannot load different versions of the .NET runtime into the same process:
doing so introduces a CLR version dependency which may conflict with the CLR version expected by the host process
这种失败模式也在an article on MSDN when using COM wrappers中注明;您可以在其中指定clrVersion:
If another version of the CLR is already loaded and the specified version can be loaded side-by-side in-process,the specified version is loaded; otherwise,the loaded CLR is used. This might cause a load failure.
如果这是Windows XP上的间歇性加载失败的原因,或者.NET框架上的先前版本,我该如何获取mscoree.dll来告诉我?
如果原因是别的,我该如何让.NET告诉我?