2010-05-19 128 views
6

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

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

这是客户的观察,也支持由RegAsm documentation

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

我很困惑这一点。混乱的

第一点:

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

第二点混淆:

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

回答

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 ])。

我认为这符合你在阅读regasm。

你的问题太旧我认为它已经OBE,但规则你可使用为把组件应用程序目录使用在GAC代码库,或具有相同和W/o com interop。每种情况都不同,我没有做足够的.NET来放弃任何深刻的见解。我喜欢xcopy安装,所以我会去在应用程序目录中(并使用registration free COM),但还有其他一些考虑因素,如两个vb应用程序必须使用相同版本的COM对象。