代码之家  ›  专栏  ›  技术社区  ›  elifiner

.NET interop:使用当前目录中的程序集

  •  4
  • elifiner  · 技术社区  · 16 年前

    我试图通过interop使用vb6中的.NET程序集,而不将其放置在GAC中,也不使用regasm.exe的/codebase参数。

    据我所知,当我在.NET类库上运行regasm.exe时,它会为类库中的每个类创建一个注册表项,告诉COM客户端他们应该加载mscoree.dll,该文件用作代理包装.NET对象以供COM使用。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中,我只是想知道为什么它不能像广告中那样工作。

    2 回复  |  直到 16 年前
        1
  •  3
  •   OJ.    16 年前

    MSDN :

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

    它看起来像广告上说的那样有效。如果不将程序集放入GAC中,则需要使用/codebase以便可以访问文件路径。

        2
  •  2
  •   jkchong    16 年前

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