无需注册的COM互操作和依赖程序集

8
我们正在将一个基于MFC的大型应用程序与一些托管的(.NET)插件集成。与这些插件的通信是通过COM完成的。
历史上,我们只使用注册表将这些插件(作为COM服务器)提供给应用程序。但是,现在我们正在尝试使用无需注册的COM互操作来实现这一点。
我们希望这些插件能够存在于与应用程序运行的目录分开的目录中,理想情况下可以放在任何地方。但是,由于无法解析与COM服务器DLL文件位于同一目录中的依赖程序集,因此我们似乎遇到了实例化服务器对象的问题。
“老式”的COM互操作通过在加载目标程序集时使用LoadFrom上下文来处理这个问题。但是激活上下文机制似乎不会这样做。
有人知道如何让这个工作吗?目前还不清楚我们是否可以在模块的SxS清单中识别依赖程序集,或者也许我们可以以不同的方式创建激活上下文?
感谢任何想法/提示!
Jeff

你找到解决方案了吗? - RayOldProf
5个回答

1
希望我理解的问题是正确的,因为我对MFC项目及其限制并不太熟悉。那么,如何使用一个“众所周知”的.NET类和接口(永久注册到MFC应用程序中),进而处理所有的激活和实例化呢?
罗德尼

2
这实际上是一个成功的解决方法:我们创建了一个C++/CLI模块,可以以无需注册的方式激活,并使用它来实例化C#类。为了使其正常工作,我们还需要设置一个AssemblyResolve事件处理程序,以便在同一目录中定位相关程序集。这样做没问题,但有点笨重。看起来应该能够在不需要这种额外的间接层的情况下正常工作。 - Jeff

0

当我查看使用ClickOnce和无需注册COM简化应用程序部署的文章时,我注意到他们在应用程序清单中引用了无需注册的COM对象DLL的文件名。我猜想这个文件名可以更改以包括目录或其他内容。

其次,在“更复杂的示例”部分中,他们将依赖的COM对象作为项目的引用并将它们设置为隔离状态。也就是说,它们现在也是无需注册的。我猜想它们的路径也可以更新。


我们实际上没有修改应用程序清单的奢侈,因为在此处加载的程序集是“插件”,可以在事后添加。也许在模块清单中做更多的事情可能是答案,但我们尝试过的任何东西都不起作用 - 这似乎只是 .NET 加载算法的问题。 - Jeff

0

有几种可能解决这个问题的方法。然而,第一步是确定为什么会失败。这需要使用fuslogvw收集Fusion日志。使用此日志,查找正在失败加载的托管COM服务器和相关程序集 - 我们需要了解服务器加载的上下文,这将告诉我们为什么相关程序集失败。

另一个选择是,根据应用程序和COM服务器的相对布局,更新探测路径

如果您能够尽早获取事件,那么“始终”有效的大锤解决方案是AppDomain.AssemblyResolve


-1

你在.NET Framework中注册了中间(interop)的dll吗?

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm "路径..\AxInterop.xxx.dll" 或者 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm "路径..\Interop.xxx.dll"

谢谢 Phani


2
感谢您的评论,Phani。尝试这样做的整个目的是避免注册。 - Jeff

-1
打开你的Visual Studio命令提示符,尝试使用regasm注册你的程序集。
regasm /tlb:"path"

3
正如我上面所提到的,我们不想注册任何东西,包括类型库。此外,在这种情况下,我们实现的接口的类型库实际上已经被注册了。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接