4

我正在尝试通过互操作使用 VB6 中的 .NET 程序集,而不将其放置在 GAC 中,并且不使用 regasm.exe 的 /codebase 参数。

据我了解,当我在 .NET 类库上运行 regasm.exe 时,它​​会为类库中的每个类创建一个注册表项,告诉 COM 客户端他们应该加载 mscoree.dll,它充当包装 .NET 对象的代理COM 使用。Mscoree.dll 使用类的注册表中的 InprocServer32/Assembly 键来确定哪个类库包含该类的实现。

如果我将 /codebase 与 regasm.exe 一起使用或将我的类库放在 GAC 中,一切正常;但据我从分散的文档中可以看出,如果 /codebase 尚未使用,mscoree.dll 应该在当前目录和路径中查找程序集(因此注册表中没有 CodeBase 条目类)并且在 GAC 中找不到它。

C# 代码尽可能简单:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace myinterop
{
    [Guid("B1D6B9FE-A4C7-11DD-B06B-E93056D89593")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class MyServer
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

并且这个问题通过我放在与编译的 DLL 相同的目录中的 VBScript 一行来重现:

object = CreateObject("myinterop.MyServer")

我在这里想念什么?mscoree.dll 在某处查找程序集的方式是否有明确的描述?

顺便说一句,我使用的是 .NET 2.0,是的,我知道我应该将我的程序集放在 GAC 中,我只是想知道为什么这不像宣传的那样工作。

4

2 回答 2

3

来自MSDN

/Codebase:在注册表中创建一个 Codebase 条目。Codebase 条目指定未安装在全局程序集缓存中的程序集的文件路径。如果您随后将注册的程序集安装到全局程序集缓存中,则不应指定此选项。使用 /codebase 选项指定的 assemblyFile 参数必须是强名称程序集。

看来它确实像宣传的那样工作。如果您不将程序集放在 GAC 中,则需要使用 /codebase 以便可以访问文件路径。

于 2008-10-28T08:58:46.337 回答
2

为了实现您想要的,我认为您需要为您的 .NET 程序集和 VB6_App.EXE(引用 .NET 程序集)创建 .manifest 文件。检查谷歌的免注册 COM。

于 2008-10-28T09:16:08.750 回答