【发布时间】:2011-04-29 17:34:56
【问题描述】:
我正在尝试在我的代码中实现无注册表 COM 显式(不能通过应用程序清单使用无注册表 COM,因为它仅适用于 exe 级别):我创建了一个加载 COM dll 的静态类,调用 DllGetClassObject,然后调用 IClassFactory::CreateInstance()。
在一定程度上工作得很好。实现细节在http://www.dimastr.com/redemption/security.htm#redemptionloader
但如果我从多个线程(例如,首先在主线程,然后从辅助线程)实例化我的 COM 对象,.Net 开始向我的对象询问 IMarshal,我没有实现。
如果 COM 库已在注册表中注册,则一切正常。如果该库未在注册表中注册(这就是所有这一切的重点),.Net 会要求 IMarshal。
有什么方法可以获得 COM 内部使用的 IMarshal 的默认实现?或者如果我的对象没有实现 IMarshal 就防止它失败?
谢谢!
【问题讨论】:
-
嗯,是什么让你相信 reg free com“只”在 exe 级别上工作?
-
因为 COM 系统从父进程 exe 中查找应用程序清单。它不可能知道调用来自 dll,因此它需要从主机 exe 以外的可执行文件中检索资源。我的 COM 库可以由另一个 dll(例如 Outlook 加载项)加载。
标签: .net windows multithreading com marshalling