【问题标题】:Is there any point in specifying a Guid when using ComVisible(false)?使用 ComVisible(false) 时指定 Guid 有什么意义吗?
【发布时间】:2026-02-06 14:30:01
【问题描述】:

在 Visual Studio 中创建新的 C# 项目时,生成的 AssemblyInfo.cs 文件包含一个指定程序集 GUID 的属性。属性上方的注释声明它用于“如果此项目暴露给 COM”。

我的程序集都不包含需要对 COM 可见的类型,所以我用[assembly: ComVisible(false)] 标记了我的程序集。那么指定 GUID 有什么意义吗?

我的感觉是答案是否定的——那么为什么默认的 AssemblyInfo.cs 文件同时包含 [assembly: ComVisible(false)][assembly: Guid("...")]


编辑:

总结回答:

在它们之间,答案解释了当且仅当使用 COM 互操作时才需要指定 GUID。因此,在我的情况下,不需要 GUID。

sharptooth 进一步解释说,[assembly: ComVisible(false)] 并不意味着不使用 COM 互操作,因为可以为个别类型覆盖 ComVisible。正是由于这个原因,默认 AssembyInfo.cs 包含 [assembly: ComVisible(false)] 和 GUID。

【问题讨论】:

标签: c# .net com guid comvisible


【解决方案1】:

同时拥有[assembly: ComVisible(false)][assembly: Guid("...")] 非常有意义in certain cases。您从一个空程序集开始,并且可能希望将其中的某些内容暴露给 COM。因此,您将程序集标记为不是ComVisible,然后将要公开的实体标记为ComVisible。这就是 GUID 存在的原因默认情况下

无论如何,如果您真的不想将程序集中的任何内容暴露给 COM,请在项目设置中取消选中“注册 COM 互操作”选项。

【讨论】:

    【解决方案2】:

    一致的 GUID 在 COM 中是绝对必要的。 [assembly:Guid] 属性生成类型库 LIBID。当然,项目模板会自动生成一个,以确保程序员在他/她将 ComVisible 翻转为 true 时不会忘记提供一个。

    如果未提供程序集 [Guid],则 Tlbexp.exe 从程序集名称、版本和公钥合成一个。这还不够好,类型库已经有一个版本。更改 [AssemblyVersion] 将生成不同的 LIBID。当您使用版本的自动增量选项(如 1.0.*)时尤其糟糕,您可能会很快用大量无效的 TypeLib 注册表项填充注册表。

    长话短说,它避免了很多令人讨厌的事故。

    【讨论】:

    • 不要忘记您可以在程序集级别将 ComVisible 设置为“false”,并为程序集中的类/接口/方法将其设置为“true”,后者将覆盖前者。请参阅*.com/questions/1649752/… 了解如何使用它。所以实际上不需要在装配级别“打开”它。
    • 只有当您的类型库需要向期望特定接口的 COM 客户端公开时,才有一致的 GUID 才真正重要。您仍然可以通过 IDispatch 向 COM 公开对象,而无需永久 GUID。
    • 嗯,后期绑定需要一致的 ProgID。同样的问题。
    【解决方案3】:

    不,没有真正的理由包含它。除了非常特定的 COM 互操作场景外,这真的非常不必要。虽然我认为拥有一个可以通过反射访问的 GUID 可能会有一些东西有用。但由于它不能保证在那里,它不像你可以依赖它。

    【讨论】:

    • 它有一个相当大的use 用于需要 SSL 证书的独立 Web 服务器
    • @jpaugh:不确定我们说的是同一件事。
    • 我自己也不太确定;但是,我必须使用程序集信息中的 GUID 才能使该方案正常工作(请参阅该页面上我的答案的底部。)我的(暂定)结论是 Windows 使用 COM 接口使 SSL 绑定“粘”到一个特定的应用程序。
    最近更新 更多