一个COM程序如何定位已经注册了COM互操作的.NET DLL?

8
一个客户想要从VB6中使用我们的.NET DLLs进行消费。它们被设计为支持反向互操作,一切都很正常…除了:在两个不同的目录中有两个单独的VB6程序。似乎需要执行以下操作之一才行:
  1. 将.NET DLL复制到两个目录中,或者
  2. 将.NET DLL安装在GAC中
这是客户的观察结果,并且得到RegAsm文档的支持:

使用Regasm.exe注册程序集后,您可以将其安装在全局程序集缓存中,以便从任何COM客户端激活它。如果该程序集仅由单个应用程序激活,则可以将其放在该应用程序的目录中。

我对此有些困惑。
第一个困惑点:
据我了解,COM运行时使用Prog ID / Class ID来定位DLL。当我在注册表中查看Class ID条目时,我会看到CodeBase键中.NET DLL的完整路径。为什么使用Prog ID / Class ID的COM程序无法使用CodeBase定位.NET DLL?
第二个困惑点:
GAC是特定于.NET的。它如何参与解析COM引用?
1个回答

7
您是正确的,COM使用ProgId获取ClassId来获取COM服务器进行加载。在.NET COM dlls的情况下,COM服务器实际上是MSCOREE,而不是.NET dll({CLSID}/localserver32下默认键的值)。然后,MSCOREE可以使用任何规则来查找.NET程序集,而不是COM。
目前为止,我不知道.NET实际上是如何工作的-这需要测试。您可以使用FUSLOGVW自行观察。但是,我可以猜测它会像加载任何其他.NET程序集一样加载程序集。
假设它只是使用ClassName值调用Assembly.Load(),那么它将遵循.NET绑定规则。首先在GAC中查找,如果没有找到,则进行探测-因此,如果定义了代码库,它将仅在那里查找,否则它将基于应用程序基础(默认情况下为应用程序目录[但不适用于ASP.NET])进行探测。
我认为这符合您在regasm中读到的内容。

您的问题太旧了,我假设它已经过时,但是将程序集放入应用程序目录中、使用代码库或将其放入GAC的规则在使用和不使用com interop时是相同的。每种情况都是不同的,我还没有做足够多的.NET来提供任何深入的见解。我更喜欢xcopy安装,所以我会选择将其放入应用程序目录中(并使用无需注册COM),但还有其他考虑因素,比如这两个vb应用程序是否必须使用相同版本的COM对象。


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