我的问题是我有一个 .NET 项目,其中包含对 COM 可见的 100 多个类。使用类的 AutoDual 属性将类发布到 COM。我的问题是我想让编译器自动生成 COM 接口(因此这个 AutoDual)但我希望能够为生成的接口指定 GUID。
目标是确保小的更改,例如:
- 添加方法
- 修改特定客户端未使用的方法
- 增加我的 DLL 的版本号
不会破坏客户端(使用早期绑定的客户端)并强制它们重新编译。
我知道(在这里阅读:为什么我不应该使用 AutoDual?)解决方案是手动创建 100 多个接口,并为每种方法提供一个 GUID 和 DispId,这样上面提到的更改就不会再破坏旧客户端。但是,我想避免实际手动编写这些接口,并且在需要在类和接口中添加新方法时必须维护它们。
到目前为止,我已经设法“自动”将这些类发布到 COM,而无需使用 PostSharp 注入以下属性来编写特定于 COM 的代码:
上课:
- ComVisible(真)
- ClassInterfaceType.AutoDual
- GUID("我自己自动生成的 GUID,但对于 gievn 类 FullName 是不变的")
关于公共方法和属性:
- DispId(xx) // 其中 xx 又是一个 dispId 生成的,但对于给定的类名/方法名对是不变的。
完成后:
- 类 GUID 是不变的,我对它们所做的任何更改
- DispId 在生成的接口上也是不变的
只有接口 GUID 会造成问题,因为每次添加方法时它都会发生变化。
我现在需要一种方法来确保给定类的生成接口始终具有相同的 GUID,方法是:
- 我不知道的特定属性,例如类上的 'AutoDualInterfaceGuid("My GUID")
- 使用我选择的 GUID 生成接口的预编译过程
- 用于修改生成的 COM 接口的 GUID 的后编译过程
- 一种修改 COM 接口默认生成的方法,以便将我的 GUID 逻辑放在那里。
任何关于如何为生成的 COM 接口设置特定 GUID 的想法将不胜感激。