Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用GuidAttribute动态声明的类_C#_Com - Fatal编程技术网

C# 使用GuidAttribute动态声明的类

C# 使用GuidAttribute动态声明的类,c#,com,C#,Com,我有一个t4模板,它基于数据库表创建许多类。这些类需要向COM公开,所以它们是用GuidAttribute属性声明的 每当我编译项目时,比如说测试一些东西并在测试环境中注册它,就会为每个类定义创建新的GUI,我开始担心我可能会对Windows注册表做一些不好的事情 如果我编译了这个项目,我有Class1的定义 [ComVisible(true)] [ClassInterface(ClassInterfaceType.AutoDual)] [GuidAttribute("AAAAAAAA-AAAA

我有一个t4模板,它基于数据库表创建许多类。这些类需要向COM公开,所以它们是用
GuidAttribute
属性声明的

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

如果我编译了这个项目,我有
Class1
的定义

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")]
public class Class1
{
    ...
}
明天我想测试其他东西,现在看起来

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB")]
public class Class1
{
    ...
}
以前的GUID是否会保留在注册表中,或者注册过程是否足够智能,可以从以前的注册中删除所有内容

整个问题可能源于我对这些guid的用途以及它们与clsid的关系的无知,但事实上它们是用类定义静态声明的,而我是动态声明的,这让我有些不安

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

如果没有显式注销组件,则为“是”。当然容易忘记。您必须从提升的命令提示符下运行Regasm.exe/uninstall

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

这取决于你如何注册。如果让MSBuild执行此操作(项目+属性、生成选项卡、注册COM互操作选项),则它将在重建DLL之前自动注销服务器。但由于您使用[Guid],它会立即将其写回(当然:)净效果为零。如果通过运行Regasm.exe手动执行,则不会发生注销


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

那么,在我的情况下,显式声明GUID是一种不好的做法吗?我之所以这样做,是因为我在另一个问题中读到,这是必要的,以便客户能够看到类的定义;例如,在我将这些属性添加到类之前,在VB6项目中,Intellisense不会显示与[Guid]属性无关的成员信息。ClassInterfaceType.AutoDual是为IntelliSense提供电源所必需的。这本身并不是一个很好的方法,因为它暴露了太多的信息。显式声明接口并使用ClassInterfaceType。在实现该接口的类上不使用任何接口是更好的方法。我明白了。。。是的,我刚从模板中删除了它,成员可见:)。关于您不使用AutoDual的建议。。。“信息太多”是什么意思?您是指.NET方法,如
Equals
GetType
等吗?或者AutoDual属性是否存在更黑暗/危险的情况?是的,这些。以及任何其他您实际上并不希望可见的实现方法(如果有的话)。