我正在尝试通过互操作使用 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 中,我只是想知道为什么这不像宣传的那样工作。