2010-11-22 108 views
4

我需要部署多個版本的相同C#.NET項目。項目輸出是用於本機應用程序的COM互操作程序集。我遇到的問題是我必須並行部署這個程序集的幾個版本,但是我所做的任何事似乎都不會創建不同的版本。相反,版本會覆蓋彼此。COM互操作並行程序集

我試過改變程序集GUID,試着改變程序集版本號,試着重新生成程序集強名稱鍵,試着改變程序集標題和說明。爲了版本管理的目的,我寧願不必更改程序集中單個類型的GUID或名稱。

如何確保這些版本不會覆蓋海誓山盟,並且我可以並排查看和部署它們?

在此先感謝!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace InteropTest 
{ 
    [Guid("...")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    public class Test 
    { 
     public Test() 
     { 
     } 

     public string Version 
     { 
      get 
      { 
       return "1.0"; 
      } 
     } 
    } 
} 

回答

5

我寧可不必更改程序集中個別類型的GUID或名稱以進行版本控制。

但是,正好你必須做什麼來防止COM類型互相干擾。 [Guid]用於選擇COM類註冊的HKLM \ Software \ Classes \ CLSID中的註冊表項。具有相同Guid的兩個不同版本將覆蓋每個其他密鑰。否則稱爲DLL地獄。更改公共接口需要一個新的Guid,以確保使用舊的客戶不會死於不可能診斷不當行爲。堅如磐石的COM要求。

忽略[Guid]屬性是非常可能的,現在您可以將其留給CLR來爲您生成一個屬性。現在,程序集屬性開始扮演一個角色,guid值由一個流暢的算法自動生成,該算法包括程序集名稱和版本以及接口上的一組方法和它們的參數。因此確保的任何自動變化產生不同的guid。並且,如預期和要求的,不同的[AssemblyVersion]將生成不同的[Guid]。

另一種方法,我認爲你的意思是'並排',是而不是註冊程序集,而是依賴於清單。它必須嵌入在客戶端程序中,您使用<clrClass>元素來聲明您的[ComVisible]類。版本控制現在成爲部署細節。 MSDN如何到is here。請記住,它必須嵌入在客戶端程序中,而不是[ComVisible]程序集中。這往往是一個問題。

+0

感謝漢斯,爲了解決這個問題。那麼我現在要按照每種類型的新GUID路徑。 – 2010-11-22 13:06:06

2

如果可以的話,嘗試在本地應用程序中對interop程序集進行後期綁定。我還建議不要使用AutoDual自動生成界面,而是明確地生成自己的讀取this以獲取更多信息。您可以通過打開註冊表編輯器並搜索Guid和ProgId來查看該程序集的哪些版本已被註冊,從而解決問題。