使用GuidAttribute动态声明的类

时间:2014-10-28 16:43:53

标签: c# com

我有一个t4模板,可以根据数据库表创建许多类。这些类需要暴露给COM,因此它们使用GuidAttribute属性声明。

每当我编译项目时,说测试一些东西并在测试环境中注册它,就会为每个类定义创建新的GUID,我开始担心我可能会对Windows注册表做坏事......

如果我编译项目并且我有Class1的定义,如

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")]
public class Class1
{
    ...
}

明天我想测试别的东西,Class1现在看起来像

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB")]
public class Class1
{
    ...
}

以前的GUID会保留在注册表中,还是注册过程足够聪明,可以删除之前注册的所有内容?

这整个问题可能来自于我对这些GUID用于什么以及它们与CLSID的关系的无知,但是它们应该用类定义声明静态,而且我和动态地做这件事让我有些不安。

1 个答案:

答案 0 :(得分:4)

  

以前的GUID是否会保留在注册表中

如果您没有明确取消注册该组件,是的。当然容易忘记。您必须从提升的命令提示符运行Regasm.exe / uninstall。

  

注册过程足够聪明,可以删除所有内容

取决于您的注册方式。如果你让MSBuild这样做(Project + Properties,Build选项卡,Register for COM interop选项),它将在重建DLL之前自动取消注册服务器。但是既然你使用[Guid],它会立即将它写回来:)净效果为零。如果您通过运行Regasm.exe手动执行此操作,则不会进行取消注册。

请记住,[Guid]在COM中是神圣的。像你一样明确指定是非常危险的,COM中有一条坚如磐石的规则,当你更改声明时,你必须更改guid。不这样做会导致非常讨厌的DLL Hell问题。只有在必须为现有COM服务器编写替换时,才能使用[Guid]属性。或者,为了避免注册表污染,当你不让MSBuild清理或者想要避免使用客户编程工具时不断重新选择类型库。但是,在完成测试后再次删除属性非常重要。容易忘记当然:))