74

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

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

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

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

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

2 回答 2

106

“使程序集 COM 可见”是使程序集中的所有公共类型 [ComVisible] 的大锤。很少需要,您将需要选择您希望可见的特定类型,就像您在代码段中所做的那样。

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

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

于 2010-09-13T11:43:21.907 回答
3

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

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

此外,重要的是要提到将库作为 COM 使用的注册表,只有在使用选项Register for COM interopMake assembly COM-Visible编译时才能在开发机器中工作。必须使用指示的命令行在每台目标计算机中手动注册它,或者生成在安装库时执行的脚本。

于 2019-01-17T16:15:50.230 回答