我有一个 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 的关系的无知,但事实上它们是用类定义静态声明的,而且我动态地这样做让我有些不安。
最佳答案
Will the previous GUID remain in the registry
如果您没有明确取消注册该组件,是的。当然很容易忘记。您必须从提升的命令提示符运行 Regasm.exe/uninstall。
is the registration process smart enough to remove everything
取决于您的注册方式。如果您让 MSBuild 执行此操作(“项目 + 属性”、“生成”选项卡、“注册 COM 互操作”选项),那么它将在重建 DLL 之前自动取消注册服务器。但既然你使用了 [Guid],它当然会立即将其写回:) 净效应为零。如果您通过运行 Regasm.exe 手动执行此操作,则不会发生取消注册。
请记住,[Guid] 在 COM 中是神圣的。像您这样显式指定是相当危险的,COM 中有一条硬性规则,即您在更改声明时必须更改 guid。不这样做会导致非常讨厌的 DLL Hell 问题。仅当您必须编写现有 COM 服务器的替代品时,使用 [Guid] 属性才是合理的。或者当您不让 MSBuild 清理时避免注册表污染,或者想要避免客户端编程工具不断地重新选择类型库来困扰您。但完成测试后再次删除该属性非常重要。当然很容易忘记:)
关于c# - 使用 GuidAttribute 动态声明的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613830/