0

我正在使用 CodeDom 生成 COM 对象,这些对象在客户端机器上经常发布/注册(从 C# 用于 VBA)。

由于我正在生成这些对象,我发现每次更新/释放 COM 对象时为每个对象获取一个新的随机 GUID 比跟踪固定的 GUID 更容易。

这是潜在的问题根源吗?

4

2 回答 2

1

必须更改每个更改的 com-api-signature的 guid 。

@paul 是正确的,更改 guid 会破坏二进制兼容性。您必须重新编译每个静态链接到您的 com 的客户端(即 ac# 客户端)。

如果您从不更改现有的 com-api-signature 而是创建新的附加方法签名,则您无法最小化客户端重新编译。

这样旧程序仍然可以使用旧 api,而新程序可以从新 api 中受益。

于 2012-12-04T14:04:59.803 回答
1

当接口或类的公共成员发生变化时,让其 [Guid] 发生变化是 COM 中的一项非常硬的要求。不这样做会调用一种非常讨厌的 DLL Hell,客户端将调用错误的方法或不存在的方法。极难诊断。更改 [Guid] 可确保客户端代码在调用无处之前得到错误。

在这种特殊情况下,更好的方法是使用 [Guid] 属性,而是让 CLR 自动生成一个。它有一个非常好的算法,只要接口或类成员不改变,就可以保持 guid 稳定。

请注意,如果使用早期绑定,则更改 guid 还需要重新编译客户端代码。由于您没有提到这是始终如一的步骤,因此客户端代码可能使用后期绑定。在 VBA 中很容易做到,尽管您会失去一些舒适感,例如代码完成和编译错误而不是运行时错误。如果它使用后期绑定,那么 [Guid] 无关紧要。检查该代码,如果您看到Dim没有As或从未添加类型库,那么它正在使用后期绑定。

于 2012-12-04T14:42:02.910 回答