2011-03-22 51 views
1

工作,我有一个非托管C++/ATL进程内COM对象(Unmanaged.dll),我试图从一个托管的C#DLL使用(Managed.dll )。不过,我想要使用免费注册的COM。我把它归结为这些步骤:如何获得免注册COM的托管/非托管互操作

  • 在开发机器上注册COM对象。进程内服务器必须具有正确注册的类型库。
  • 添加到C#项目中的COM对象的引用,然后将参考属性设置为隔离=真。

这产生了Unmanaged.dll,Managed.dll和Native.Managed.manifest。打开清单,很清楚系统如何使用它以无注册方式加载COM对象。

这里是擦。我有一个托管的EXE(Managed.exe),它动态加载Managed.dll来访问公共类型。我的意思是“动态”,它使用Assembly.LoadFrom(“Managed.dll”)。当Managed.dll内部的代码尝试创建COM对象时,它会得到“类未注册”异常。看起来,当Managed.dll加载时,激活上下文不能正确设置。

是否有一种方式来获得免费的注册COM在这种情况下工作吗?没有答案

回答

2

两天,所以这里是我想出在那个时候......

它确实看起来像激活上下文是建立基于关联的清单在工艺推出的OS与主EXE。这意味着所有免注册的COM相关元素必须在进程启动时位于Main.exe.manifest中。这打破了EXE和DLL之间的隔离。如果一个DLL负责创建COM对象,那么您不会期望EXE清单必须包含无reg的COM信息。您可能已经预期与DLL关联的清单在DLL加载时合并到进程激活上下文中,但它不会。

要解决此问题,DLL必须创建COM对象之前配置一个新的激活上下文。更糟糕的是,目前(从.NET 4.0开始)没有管理的方式来做到这一点。因此,该DLL必须的PInvoke以下Win32函数:

我包裹这些调用与调用CreateActCtx和管理类构造函数中的ActivationActCtx和IDisposable :: Dispose中的DeativateActCtx和ReleaseActCtx。

+0

而你得到这个工作?我有一个非常类似的问题:从受管DLL中使用regfree ActiveX,它由nUnit加载和运行,所以我无法真正破解应用程序清单。但ActCtx函数拒绝为我工作,我可能错过了一些简单的... – Spike0xff 2011-08-30 22:23:07