2014-01-08 30 views
3

我們有一個.NET COM(.NET 3.5,VS 2010 SP1,VB.NET)項目,它是COM可見的。 VB6應用程序使用CreateObject從該程序集創建對象。
如果我們不簽署程序集,這可以毫無問題地工作。如果我們籤組件(具有PFX證書),創建對象失敗的消息CreateObject在COMVisible程序集簽名後失敗

不能創建對象「Our.ClassName」

不幸的是,在事件日誌中沒有條目。 .NET exe可以在沒有任何問題的情況下啓動,因此所有的依賴關係都應該存在。我們還啓用了.NET綁定日誌記錄,但在調用CreateObject時它不寫任何內容(因此我們懷疑在程序集加載之前創建失敗)。
我們追蹤了所有更改,唯一的區別在於程序集是否已簽名。我們也嘗試了不同的證書,但行爲不會改變。

有沒有人遇到過這種行爲,並可以提供解決方案?有什麼方法可以給我們提供關於失敗的更多信息嗎?

+0

是http://stackoverflow.com/a/3747593/11683的任何幫助? – GSerg

回答

1

對註冊表的另一個仔細觀察發現,原因是程序集版本號發生了變化。前段時間,版本3.0.0.0已經註冊 - 顯然是沒有強名的版本。在構建過程中進行了一些更改後,版本被重置爲1.0.0.0。

REGASMREGASM註冊表中的註冊版本1.0.0.0,但當我們嘗試重新註冊程序集時(但當然)未能在註冊表中的鍵HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{00000000-0000-0000-0000-000000000000}\InprocServer32下刪除版本3.0.0.0。

CreateObject在解析程序集時使用最高版本,因此獲取沒有強名稱的程序集引用。這個引用被綁定到版本爲1.0.0.0的程序集(因爲它不是強命名的,版本的差異沒有被遵守),因此它可以在沒有強名稱的程序集中正常工作。
我們會將版本重置爲舊值以保持一致性。

1

強命名程序集更改其PublicKeyToken。這是程序集的完全限定名稱的一部分,它在程序集註冊時記錄在註冊表中。例如,運行Regedit.exe並導航到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{00000100-0000-0010-8000-00AA006D2EA4}\InprocServer32,程序集值。你會看到:

道,版本= 10.0.4504.0,文化=中性公鑰= 31bf3856ad364e35

所以註冊在簽訂之後,再次它的組件是硬性要求。再次運行Regasm.exe。

不要忘記,如果您不使用/ codebase選項,那麼您必須將程序集放到GAC中。首先給大會一個強有力的名字是通常的原因。

+0

+1爲您的全面解釋。事實證明,版本的變化和強名稱導致了這個問題。謝謝。 – Markus