2014-10-28 78 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