代码之家  ›  专栏  ›  技术社区  ›  user200783

使用comvisible(false)时指定guid有什么意义吗?

  •  36
  • user200783  · 技术社区  · 14 年前

    在visual studio中创建新的c项目时,生成的assemblyinfo.cs文件包含指定程序集guid的属性。属性上方的注释说明它是“如果此项目公开给COM”使用的。

    我的程序集都不包含需要对COM可见的类型,因此我已将程序集标记为 [assembly: ComVisible(false)] . 那么指定一个guid有什么意义吗?

    我的感觉是答案是“否”-那么为什么默认的assemblyinfo.cs文件同时包含 [程序集:ComVisible(false)] [assembly: Guid("...")] ?


    编辑:

    总结回答:

    在这两者之间,答案解释了当且仅当使用COM互操作时需要指定一个guid。所以,在我的情况下,不需要guid。

    锐齿进一步解释了 [程序集:ComVisible(false)] 并不意味着不使用COM互操作,因为可以重写 ComVisible 对于个别类型。因此,默认assemblyinfo.cs包含 [程序集:ComVisible(false)] 还有一个GUID。

    3 回复  |  直到 5 年前
        1
  •  15
  •   StayOnTarget    5 年前

    [assembly: ComVisible(false)] [assembly: Guid("...")] 同时也很有道理 in certain cases . 您从一个空程序集开始,可能希望将它中的某些内容公开到COM。所以你把集会标记为 ComVisible 然后将要公开的实体标记为 可看见的 . 这就是guid存在的原因 默认情况下 .

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

        2
  •  9
  •   Hans Passant    14 年前

    一致的guid在com中是绝对必要的。[assembly:guid]属性生成类型库libid。当然,项目模板会自动生成一个模板,以确保程序员在将comVisible转换为true时不会忘记提供一个模板。

    如果未提供程序集[guid],则tlbexp.exe将从程序集名称、版本和公钥合成一个程序集。这还不够好,类型库已经有了一个版本。更改[assemblyversion]将生成不同的libid。特别糟糕的是,当您对版本(如1.0.*)使用auto increment选项时,您可以用大量死的typelib注册表项快速填充注册表。

    长话短说,它避免了许多可怕的灾难。

        3
  •  4
  •   Josh    14 年前

    不,没有真正的理由包括在内。除了在非常特定的COM互操作场景中,这是非常不必要的。尽管我想可能有 某物 有一个可以通过反射访问的guid很有用。但既然它不一定会在那里,你就不能依赖它了。