2014-10-28 60 views
2

我有一个t4模板,可以根据数据库表创建许多类。这些类需要暴露给COM,因此它们被声明为GuidAttribute属性。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,但事实上,他们是为了被宣布静态与类的定义,而我这样做动态地让我有些不安。

回答

4

将以前的GUID留在注册表

如果不明确注销部分,是的。当然容易忘记。您必须从提升的命令提示符处运行Regasm.exe/uninstall。

是注册过程很聪明,除去一切

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

请记住[Guid]在COM中是神圣的。明确指定像你这样做是相当危险的,在COM中有一个坚硬的规则,当你改变声明时你必须改变guid。不这样做会导致非常讨厌的DLL地狱问题。当您必须为现有COM服务器编写替代品时,使用[Guid]属性才是合理的。或者为了避免注册表污染,当你不让MSBuild清理或者希望避免一个客户端编程工具在不停地重新选择类型库的时候给你带来麻烦。但是当你完成测试时,再次删除属性是非常重要的。当然容易忘记:)

+0

那么你会说明确地声明GUID对我来说是一个坏习惯吗?我只是这样做,因为我在另一个问题中读到,有必要让客户端*看到这个类的定义;例如,在将这些属性添加到类中之前,在VB6项目中,Intellisense不会显示成员信息... – ferc 2014-10-28 17:44:10

+0

与[Guid]属性无关。 ClassInterfaceType.AutoDual是启动IntelliSense所需的类。本身并不是一个很好的方式,因为它暴露了太多的信息。明确声明接口并在实现它的类上使用ClassInterfaceType.None是更好的方法。 – 2014-10-28 17:48:18

+0

我看到...是的,我刚刚从模板中删除它,成员都可见:)。关于你不使用AutoDual的建议......你对“太多的信息”有什么意思?你指的是像“Equals”,“GetType”这样的.NET方法吗?或者有什么比AutoDual属性更黑/更危险的事情? – ferc 2014-10-28 18:14:23