【问题标题】:.NET Interop: Using an assembly in the current directory.NET 互操作:使用当前目录中的程序集
【发布时间】: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


    【解决方案1】:

    来自MSDN

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不知道你能做到。酷!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多