【发布时间】:2008-10-28 08:41:09
【问题描述】:
我正在尝试通过互操作使用 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 条目class) 并且在 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 中,我只是想知道为什么这不像宣传的那样工作。
【问题讨论】:
标签: c# .net vb6 interop com-interop