用GuidAttribute动态声明的类

本文关键字:声明 动态 GuidAttribute | 更新日期: 2023-09-27 18:28:05

我有一个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的关系,但它们是用类定义静态地声明的,而我是动态地这样做的,这让我有些不安。

用GuidAttribute动态声明的类

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

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

注册过程是否足够智能,可以删除所有

取决于您的注册方式。如果让MSBuild执行此操作(Project+Properties,Build选项卡,Register for COM interop选项),则它将在重新生成DLL之前自动注销服务器。但由于您使用了[Guid],它会立即将其写回:)净效果为零。如果您通过运行Regasm.exe手动完成,则不会发生注销。

请记住,[Guid]在COM中是神圣的。像这样明确指定是非常危险的,COM中有一条严格的规则,即在更改声明时,必须更改Guid。不这样做会导致非常恶劣的DLL地狱般的问题。只有当您必须为现有COM服务器编写替换项时,使用[Guid]属性才是合理的。或者,当您不让MSBuild清理或希望避免客户端编程工具不断重新选择类型库时,为了避免注册表污染。但是,当您完成测试时,再次删除该属性是非常重要的。当然很容易忘记:)