2014-09-03 50 views
0

我必須處理一個COM類,它或多或少是一個更大系統的黑盒子組件。這個類來自COM EXE,並且使用已知的AppID和Typelib ID在系統中註冊。如何註冊一個.NET程序集來代替現有的COM服務器?

爲了調試和記錄的目的,我創建了一個模擬類,它在C#中實現了相同的接口。問題是:如何註冊我的程序集,以便當調用應用程序嘗試實例化接口時,它將實例化我的類?

編輯更多的信息:

我有以下幾點:類型庫的GUID,實現類的GUID,類的進程id GUID。我做了以下,導入類型庫後:

[ComVisible(true)] 
[ProgId("The.ProgId.Of.The.Old.Class")] 
[Guid("{the guid of the old class}")] 
public class MockImplementation : ISomething 
{ 
    // ... 
} 

我嘗試註冊我的課是這樣的:

 
regasm /codebase myassembly.exe 

然而,沒有任何反應。應用程序仍然實例化舊類。我究竟做錯了什麼?

+0

[你有沒有檢查這個(http://blogs.msdn.com/b/jigarme/archive/2008/04/28/how-to-register-net-assembly-for-com-interop.aspx) – 2014-09-03 15:10:02

+0

@SriramSakthivel這似乎並沒有回答這個問題。 – 2014-09-03 15:13:26

+1

只要你有完全相同的接口定義和GUID,你應該能夠通過註冊來完全替代COM服務器,但是如果你的IDL從.NET生成時略有不同,我不會感到驚訝。 – 2014-09-03 15:18:42

回答

1

這個類是從一個COM EXE

千萬記住,你沒有編寫過程外的一個COM服務器一個真正的替代品。您的替代品是一個進程內服務器。一個DLL。他們的位置存儲在不同的註冊表項中,out-of-proc使用LocalServer32密鑰,in-proc使用InProcServer32密鑰。我看不到你的測試代碼來判斷哪一個會被使用。但顯然這是錯誤的:)

Regasm.exe也是一個可能的麻煩點。請記住,它有兩個版本的。來自c:\ windows \ microsoft.net \ framework的32位版本將寫入32位註冊表項,而來自framework64的64位版本將寫入64位註冊表項。這兩個工作都很好,.NET代碼可以在任何一種模式下運行,但您的測試應用程序將只使用其中的一種。取決於配置,VS測試運行器默認爲32位模式afaik。

您的基本故障排除工具是SysInternals的Process Monitor。很高興看到現有COM服務器和替換件都使用了哪些註冊表項。作爲一個起點,觀察現有服務器註冊本身,以便您知道正好什麼註冊表項很重要。通常通過使用/ regserver命令行選項運行EXE來完成。記下你看到寫入的CLSID,Interface和TypeLib鍵。

然後只要在運行Regasm.exe時再次執行此操作,將您看到的內容與寫下的內容進行比較。一定要使用/ codebase選項,以便不依賴於GAC。您是否使用/ tlb選項是判斷呼叫。首先使用它來比較鍵。隨着期望,你現在看到InProcServer32被寫入而不是LocalServer32,這是不可避免的。

然後再做一次,現在運行您的測試應用程序。比較你看到的這個時間閱讀與你的筆記。您可能不得不使用LocalServer32密鑰來防止它被使用。或者更好的是,完全註銷舊的服務器,以免妨礙它,通常使用/ unregserver選項完成。您必須重新運行Regasm.exe以在此之後重置密鑰。

+0

謝謝,您的答案中有很多有價值的信息。在我的情況下,問題是比特不匹配。 – 2014-09-05 08:07:25

相關問題