2011-03-31 112 views
1

我們的客戶使用舊版Win32客戶端,它使用我們提供的本地C++ COM註冊.dll。用.NET COM替換原生C++ COM .dll

我們希望用.NET版本替換原生.dll。所以我們已經構建了.NET DLL並且COM註冊了它。我們有本地的C++測試客戶端,它們能夠處理從舊的.dll到新的交換,但是......似乎我們需要重新編譯它們才能正常工作。

爲什麼我們需要重新編譯測試客戶端,或者我們做錯了什麼,是否有一些合乎邏輯的原因?

我們不能要求我們的客戶重新編譯他們的客戶。

+0

可能因爲TLB文件或GUID不同,所以它不會識別新的接口。我假設你正在構建一個COM到.NET包裝器的DLL,因爲舊的Win32客戶端不理解.NET,對嗎? – 2011-03-31 16:30:38

回答

7

也許你忘了在接口和類聲明中使用[Guid]屬性。他們必須匹配IDL中用於舊C++項目的IID和CLSID。或者這些功能不再以相同的順序。或者他們沒有相同的DISPID,以防客戶端代碼遲到使用它們。

避免這種情況的最好方法是在.NET項目中添加對舊類型庫的引用,以便在代碼中使用舊接口。您仍然需要獲得實現接口的類的[Guid],以便它具有正確的CLSID。

您可以使用OleView.exe工具View + Type Library來比較舊的和新的類型庫。複製/粘貼生成的IDL並對其進行分析。您從Regasm.exe/tlb中獲得新的類型庫。任何不匹配都可能(也可能會)成爲問題。