我正在尝试通过interop从VB6使用.NET程序集而不将其放在GAC中,而不使用regasm.exe的/ codebase参数。

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

如果我使用/ codebase和regasm.exe或将我的类库放在GAC中,一切正常;但据我从散乱的文档中可以看出,mscoree.dll应该在当前目录和路径中寻找汇编,如果/ codebase没有被使用(因此注册表中没有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;
        }
    }
}

问题再现了一个VBScript一个衬垫,我把它放在与编译的DLL相同的目录中:

object = CreateObject("myinterop.MyServer")

我在这里缺少什么?有没有明确的描述mscoree.dll在某处查找程序集的方式?

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

有帮助吗?

解决方案

来自 MSDN

  

/ Codebase :在。中创建一个Codebase条目   注册表中。 Codebase条目指定   程序集的文件路径   未安装在全局程序集中   缓存。你不应该指定这个   选项,如果你随后   安装你的程序集   注册全球大会   缓存。 assemblyFile参数   您使用/ codebase选项指定   必须是一个强有力的集会。

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top