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


69

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

注册COM Interop
此选项在程序集上执行重排,并在注册表中将所有程序集之类的COM项注册为COM组件(可能不是)将程序集注册为COM组件。此步骤会生成TLB文件吗?还有什么?

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

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

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

Answers:


103

“使程序集COM可见”是在程序集中使所有公共类型都可用的重要工具[ComVisible]。极为可取的是,您将希望选择想要显示的特定类型,就像在代码段中所做的那样。

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

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


1

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

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

另外,必须提及的一点是,如果使用“注册COM互操作”和“使程序集成COM-Visible ”选项进行编译,则将库用作COM的注册表仅在开发计算机中可用。必须使用指示的命令行在每台目标计算机中手动注册它,或者生成在安装库时执行的脚本。


关于TLB注释-因为我确实使用了“注册com互操作注册”设置,所以我从不需要手动执行此操作。通过该设置,Visual Studio可以很好地管理这些细节。您在什么情况下需要手动注意这一点?
UuDdLrLrSs 2012年

此外,还涉及安装期间的注册-仅当未使用应用清单文件并排安装您的应用程序时才如此。特别是在将新的.NET程序集集成到较旧的非托管应用程序(如VB6)的情况下,这样做的能力通常被忽略。
UuDdLrLrSs 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.