COM程序如何找到为COM Interop注册的.NET DLL?

Eri*_* J. 8 gac com-interop regasm

一个客户想要从VB6使用我们的.NET DLL.它们旨在支持反向互操作,所有工作都很好......除了:在两个不同的目录中有两个单独的VB6程序.似乎有必要做一个:

  1. 将.NET DLL复制到两个目录中,或
  2. 在GAC中安装.NET DLL

这是客户的观察,也得到了RegAsm文档的支持:

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

我对这一点感到困惑.

第一点困惑:

据我所知,COM运行时使用Prog ID/Class ID定位DLL.当我在类ID条目的注册表中查看时,我在CodeBase键中看到了.NET DLL的完整路径.为什么使用Prog ID/Class ID的COM程序无法使用CodeBase找到.NET DLL?

第二点困惑:

GAC特定于.NET.它如何参与解析COM引用?

Ton*_*Lee 7

你是对的COM使用ProgId到达ClassId来加载COM服务器.对于.NET COM dll,COM服务器实际上是MSCOREE,而不是.NET dll({CLSID}/localserver32下的默认密钥的值).MSCOREE,而不是COM,然后可以使用它想要的任何规则来查找.NET程序集.

在这一点上,我不知道.NET真正做了什么 - 这需要测试.您可以使用FUSLOGVW观察自己.但是,我可以猜测它加载程序集就像加载任何其他.NET程序集一样.

假设它只使用ClassName值调用Assembly.Load(),它将遵循.NET绑定规则.首先看一下GAC,如果没有找到将探测 - 所以如果定义了一个代码库,它只会查看那里,否则它将根据应用程序库进行探测(默认情况下是应用程序的目录[但不适用于ASP.NET] ]).

我认为这符合您的解释.

你的问题太旧我认为它已经出窍,但你会使用将组件的规则应用程序目录,使用一个代码库,或在GAC是相同与和W/O COM互操作.每种情况都不同,我没有做足够的.NET来放弃任何深刻的见解.我赞成XCOPY安装,因此我会在应用程序目录中去(和使用注册免费COM),但也有其他方面的考虑一样,如果两个VB程序必须使用COM对象的同一版本.