【问题标题】:Default IMarshal implementation?默认 IMarshal 实现?
【发布时间】: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


【解决方案1】:

CoGetStandardMarshal用于获取默认实现;但是这个方法没有记录——你必须四处搜索才能得到它的原型。

但是,如果您不提供IMarshal 接口,则使用default implementation。因此,我认为问题出在其他地方。

【讨论】:

  • 是的,我确实最终使用了 CoGetStandardMarshal - 一旦我这样做了,它就完美地工作了。谢谢!
  • 如果没有在注册表中注册接口,则不使用默认的 IMarshal。这是一个 .Net 特有的问题 - 我从 DllGetComServer 返回了相同的 IClassFactory,并且 .Net 将它与它在不同线程上的调用中已经拥有的 IClassFactory 进行了比较。然后将调用编组到该线程,如果 IMarshal 没有明确返回,.Net 会在该线程中阻塞。在我使用完 Marshal.ReleaseCOMOBject() 后让 .Nte 立即忘记 IClassFactort 解决了这个问题。
猜你喜欢
  • 2023-03-10
  • 2014-10-01
  • 2020-12-18
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多