一位客户想要从VB6使用我们的.NET DLL。它们旨在支持反向互操作,所有工作都很好......除了:在两个不同的目录中有两个单独的VB6程序。似乎有必要做一个:
这是客户的观察,也得到了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引用?
答案 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对象。