“注册COM Interop”vs“使程序集COM可见”

时间:2010-09-13 10:58:13

标签: .net visual-studio com-interop compiler-options

这两个选项之间的真正区别是什么?我所知道的是:

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

有时我看到在编译项目时会生成tlb但有时不会生成,为什么会这样?

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

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)]
public interface IMyInterface
{
}

2 个答案:

答案 0 :(得分:96)

“使程序集COM可见”是在程序集[ComVisible]中使所有公共类型变大的重要工具。非常需要,您需要选择要显示的特定类型,就像您在代码段中所做的那样。

构建程序集后,需要对其进行注册,以便COM客户端可以找回它。只使用一个数字来标识他想要创建的对象,GUID,需要额外的查找来找出DLL实现它。注册涉及在注册表的HKLM\Software\Classes\CLSID\{guid}部分中编写密钥。您可以通过运行Regasm.exe /codebase /tlb来自行完成,也可以将其留在构建系统中,以便在构建程序集后自动执行此操作。

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

答案 1 :(得分:0)

除了所选答案中的注释外,如果更改类型或方法而未先从Windows注册表中删除相应记录(或关闭应用程序或使用该库的服务),请使用RegAsm实用程序的/ U选项:

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

此外,重要的是要提到,如果使用选项 Register for COM interop 使程序集成为COM-Visible 。必须使用指示的命令行在每台目标计算机中手动注册它,或者生成一个在安装库时执行的脚本。

我很抱歉将此评论作为答案,但由于要求获得50分的信誉,因此无法将评论放入帖子中。