gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:46:39 26 4
gpt4 key购买 nike

我有一个基于数据库表创建许多类的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com