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

时间:2010-05-19 17:47:50

标签: gac com-interop regasm

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

  1. 将.NET DLL复制到两个目录中,或
  2. 在GAC中安装.NET DLL
  3. 这是客户的观察,也得到了RegAsm documentation

    的支持
      

    使用注册装配后   Regasm.exe,你可以在它中安装它   全局程序集缓存,以便它可以   从任何COM客户端激活。如果   组装只会是   您可以通过单个应用程序激活   可以把它放在那个应用程序中   。目录

    我对这一点感到困惑。

    第一点困惑:

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

    第二点困惑:

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

1 个答案:

答案 0 :(得分:6)

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

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

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

我认为这符合您的解释。

您的问题已经过时了我认为它已经OBE了,但您用于将程序集放入应用程序目录中的规则使用代码库 ,或GAC中的 与/或互操作相同。每种情况都不同,我没有做足够的.NET来放弃任何深刻的见解。我赞成xcopy安装,所以我会在app目录中使用(并使用registration free COM),但还有其他一些注意事项,例如两个vb应用程序是否必须使用相同版本的COM对象。

相关问题