"注册为COM互操作"与"使程序集对COM可见"的区别。

78

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

注册COM互操作
该选项在程序集上执行regasm并将程序集作为COM组件(或者可能不是)在注册表中注册,具有所有类似COM的注册表项。 这一步会生成TLB文件吗?还有其他操作吗?

有时候我编译项目时会看到生成tlb文件,但有时却没有,为什么会这样呢?

使程序集对COM可见
这个选项对程序集有什么影响?如果我有以下类型在此程序集内,即使我的类型标记为ComVisible,我是否仍需要指定“使程序集对COM可见”?

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

109
"使程序集的COM可见性" 是一种强制使程序集中所有公共类型都变成 [ComVisible] 的大锤。这很少是可取的,你会想要选择特定的类型来让它们可见,就像在代码片段中所做的那样。
在构建程序集之后,需要进行注册以便COM客户端可以找回它。 COM客户端仅使用一个数字来标识他想要创建的对象,即GUID,因此需要额外查找以找出哪个DLL实现了它。 注册涉及编写注册表中 `HKLM\Software\Classes\CLSID\{guid}` 部分的键值。 您可以通过运行 `Regasm.exe /codebase /tlb` 自己完成注册,也可以让构建系统在构建程序集后自动完成。
这就是"为COM互操作注册"的作用。这是可取的,因为它确保旧的DLL副本在被覆盖之前会自动取消注册,从而防止注册表污染。VS需要以管理员身份运行才能对这些注册表键进行写入访问,这是将其作为可选项的原因之一。或者您只是不想注册它,在构建服务器上很常见。如果没有更多的诊断,我无法对为什么有时无法获得.tlb文件发表评论。

4

除了已经接受的答案外,如果在没有首先从Windows注册表中删除相应记录(或关闭使用库的应用程序或服务)的情况下更改了类型或方法,则不会创建.tlb文件。可以使用RegAsm实用程序的/U选项来解决这个问题:

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

另外,需要提到的是,将库用作COM消费者的注册表只有在使用注册为COM互操作使程序集可见选项编译时才能在开发机器上运行。需要在每台目标计算机上手动注册它,使用指定的命令行或生成在安装库时执行的脚本。


关于TLB注释 - 我从未手动执行此操作,因为我使用了“注册COM互操作”设置。有了这个设置,Visual Studio可以非常好地管理这些细节。您在什么情况下需要手动注意这一点? - StayOnTarget
关于安装过程中的注册问题 - 如果您的应用程序未使用应用程序清单文件并且未侧向安装,则才属实。能够这样做的能力经常被忽略,特别是在将新的.NET程序集集成到旧的非托管应用程序(如VB6)中的情况下。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接