2010-03-25 127 views
1

我無法在COM中公開.NET程序集。看來,我必須失去一些基本的步驟,因爲我覺得我跟所有的教程和文檔,我發現還有常識,但仍當我做(在測試的VBScript):將.NET程序集公開爲COM 101

Set o = CreateObject("MyLib.MyClass") 

它口口聲聲說該對象無法創建。

下面是我做的步驟:

  1. 我有一個不帶屬性的簡單方法之一啞類。
  2. 該類是在類庫中有在Visual Studio中打勾爲「使程序集COM可見」
  3. 類庫已簽名。
  4. 該DLL是通過註冊RegAsm.exe/codebase參數(我不希望/不能將該DLL添加到GAC)。

可以肯定的是,我試圖將庫複製到與測試VBScript相同的目錄中,但它沒有幫助。

編輯:我應該提到我可以在COM中實例化類,如果我把該DLL放入GAC。

編輯:已解決。我沒有一個完整的解釋,但最終我發現,通過使用它造成的:

%WINDIR%\ Microsoft.NET \框架\ V2.0.50727 \ RegAsm.exe

,而不是64位版本:

%WINDIR%\ Microsoft.NET \ Framework64 \ V2.0.50727 \ RegAsm.exe

我比較的兩個RegAsm的的生成註冊表項,它們是相同的。所以猜測他們生成的東西不是註冊表項。

+0

確切的錯誤是什麼?什麼是堆棧跟蹤?我不知道它是否會找到你的DLL(因爲你使用了/ codebase參數),但是找不到其他的依賴DLL。 – PatrickSteele 2010-03-25 12:01:13

+0

我打算調查錯誤的詳細信息,但在此之前,我已經認爲這是因爲AsmReg版本錯誤(請參閱下面的答案)。此外,它曾經在GAC中工作,並且該庫確實有任何依賴關係。所以這個問題最可能的根源似乎是一些註冊問題。 – 2010-03-25 13:02:12

回答

0

我沒有一個完整的解釋,但最終我發現,通過使用它造成的:

%windir%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe 

,而不是64位版本:

%windir%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe 

我對比這兩個RegAsm的註冊表鍵都是相同的。所以猜測他們生成的東西不是註冊表項。

2

你應該增加一些屬性:

的接口:

[Guid("4200ead6-8252-412c-8c7e-c3b586ac40d6")] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 

類:

[Guid("9f718717-bc09-48f1-8ab1-00fa3abf4147")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("MyLib.MyClass")] 
+0

你會想讓GUID _unique_ – 2010-03-25 11:45:49

+1

是!這是我的GUID,不要使用它們:) – Andrey 2010-03-25 11:49:27

+0

謝謝你的迴應。我剛剛嘗試過,但沒有幫助。 – 2010-03-25 11:50:12

2

是的,這是在64位操作系統上設計的。很多COM組件都是進程內DLL,只能用作32位DLL。一個64位程序無法加載任何32位代碼。爲防止它們發生故障,註冊表被虛擬化;不同的程序對註冊表有不同的看法。

32位程序實際上看到HKLM \ Software \ Wow6432 \ Classes中的鍵。 64位程序會看到常規密鑰。這可以自動避免COM服務器故障。因爲它們可以在32位和64位模式下運行,所以.NET服務器是不尋常的,JIT編譯器負責處理這個問題。你通常應該做的是運行兩個版本的Regasm.exe。 Framework文件夾中的一個將爲32位程序註冊服務器,來自Framework64文件夾的註冊該服務器以用於64位程序。

相關問題