2013-07-22 25 views
0

我正在將VB6應用程序轉換爲C#.net並在共享添加上工作。在單擊MS Word中的一個按鈕時,我想打開我的應用程序,因爲它正在創建類的對象。Interaction.CreateObject創建舊對象

objApp = Interaction.CreateObject("DocSys.Application"); 

但這行代碼總是返回舊的vb6應用程序instace,而我添加.net項目的refrance。 我應該做些什麼來獲得.net對象。

+0

過去了一段時間,因爲我搞砸了VB6及其COM支持,但也許這與運行對象表有關,共享程序實例在哪裏註冊?嘗試閱讀。 http://stackoverflow.com/questions/11835617/understanding-the-running-object-table –

+0

@ Shahar-Kashtan我完全離開了這個概念,請幫助我做什麼。 –

回答

1

有多種方法可以解決這個問題。例如,忘記製作界面和類[ComVisible(true)]。或忘記註冊COM服務器,明確使用Regasm.exe/codebase/tlb完成。或者使用Regasm.exe的錯誤版本,64位版本將寫入錯誤的註冊表項。

與CreateObject()更相關,C#類中的[ProgId]屬性對於確保爲VB6服務器創建精確的替代品至關重要。如果客戶端代碼使用了早期綁定,那麼重要的是您的接口和類的[Guid]屬性與VB6服務器使用的guid匹配的是確切的。當然,這些方法和屬性必須是,正好與VB6服務器使用的匹配,順序也很重要。

將橙色與蘋果進行比較的最佳方法是使用Oleview.exe實用程序。從Visual Studio命令提示符運行它並使用File + View Typelib。首先選擇你的VB6服務器。複製/粘貼您在文本文件中看到的IDL並將其保存,以便不必重複執行此操作。

在您的C#程序集上運行tlbexp.exe以爲您的C#服務器創建類型庫。再次運行Oleview.exe並選擇該.tlb文件。現在您可以比較服務器的IDL和VB6服務器的IDL。確保你在指導,方法和屬性上有精確的匹配。


最後但並非最不重要,如果客戶端代碼實際使用Interaction.CreateObject(),那麼它是一個.NET應用程序。這意味着你根本不應該創建一個[ComVisible] COM服務器。它應該是一個普通的.NET程序集,只需添加引用即可,並直接使用公共類。