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

注册COM互操作“vs”使程序集COM可见

  •  64
  • A9S6  · 技术社区  · 16 年前

    这两种选择的真正区别是什么?我知道的是:

    注册COM互操作
    此选项在程序集上执行regasm,并在注册表中将程序集作为COM组件(或可能不是)注册到所有类似COM的注册表项中。 此步骤是否生成TLB文件?还做了什么?

    有时我看到在编译项目时生成了一个TLB,但有时不是,这是为什么?

    使程序集COM可见
    这个对组件有什么影响?如果我在这个程序集中有以下类型,即使我的类型被标记为ComVisible,我仍然需要指定“使程序集COM可见”吗?

    [GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)]
    public interface IMyInterface
    {
    }
    
    2 回复  |  直到 7 年前
        1
  •  96
  •   Hans Passant    9 年前

    “使组件可见”是一个巨大的锤子 全部的 程序集中的公共类型[ComVisible]。很少需要,您需要选择希望可见的特定类型,就像您在代码片段中所做的那样。

    生成程序集后,需要注册它,以便COM客户端能够找到它。它只使用一个数字来标识他要创建的对象,即guid,需要进行额外的查找,以确定哪个dll实现了它。注册涉及在 HKLM\Software\Classes\CLSID\{guid} 注册表的一部分。你可以自己跑步 Regasm.exe /codebase /tlb 或者,您可以让构建系统在构建程序集后自动执行该操作。

    这就是“注册COM互操作”所做的。这是可取的,因为它可以确保旧的DLL副本在被覆盖之前自动取消注册,从而防止注册表污染。vs需要提升运行权限才能对这些注册表项进行写访问,这是使其成为可选的一个原因。或者您只是不想注册它,在构建服务器上很常见。如果没有更多的诊断,我无法解释为什么你有时得不到.tlb。

        2
  •  0
  •   César Qüeb    7 年前

    除了在所选答案中所做的注释外,还有。 薄层色谱法 如果类型或方法未先从Windows注册表中删除相应记录(或关闭使用库的应用程序或服务),则使用regasm实用程序的/u选项不会创建文件:

    Regasm.exe yourlibrary.dll /codebase /tlb /u
    

    另外,必须指出的是,如果使用选项编译库,则将库作为COM使用的注册表只在开发计算机中工作。 注册COM互操作 和 使程序集COM可见 . 需要使用指定的命令行在每个目标计算机中手动注册它,或者生成在安装库时执行的脚本。

    很抱歉将此评论作为答案,但我无法将评论放在帖子中,因为我要求50点的声誉。

    推荐文章