c# - 使用 GuidAttribute 动态声明的类

标签 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 的关系的无知,但事实上它们是用类定义静态声明的,而且我动态地这样做让我有些不安。

最佳答案

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/

相关文章:

c# - 什么相当于 c# 中的 Microsoft.VisualBasic.Collection?

c# - 如何为使用 ilasm 生成的 Interop DLL 设置文件版本

c# - COM+ 远程处理错误代码 8000401a 因为身份选项卡下此用户的密码正在重置

c++ - 正确的 VARIANT 初始化

c# - VBA 中自定义 COM 类中的 IntelliSense

c# - 如何从 c#.net 中的文本文件中删除空行

c# - 编辑 DisableTaskMgr 值时出现 "Cannot write to the registry key"错误

c# - 右键单击时不触发上下文菜单

c# - if 循环和指标内的代码行数更多

c# - 在 .NET 应用程序中使用免注册 com