2010-11-09 69 views
0

我在C++和VB6中有一個COM對象,並且所有東西都使用Visual Studio 2003進行編譯和打包.C++生成DLL和VB6 EXE,所以從我可以調用的遺留代碼調用DLL等的EXE。將C++ vb6 COM對象轉換成dot net

我需要將這些遷移到Visual Studio 2008。不過,我有一些問題

1)我可以編譯C++和生成的DLL - (我認爲是確定) 2)VB.Net沒有按」沒有選擇生成COM/ActviveX了VB6,所以不知道 - 我試圖生成Windows EXE和調用DLL,但它不起作用。我認爲是因爲它有一些COM調用。

那麼什麼是擺脫COM/ActiveX和提供某些東西的最佳解決方案?

用C++編譯並在VB.net中加載引用?我試過這個但是DLL不加載.........

+0

亞歷克斯你可能想打破這個問題,並提出有關重新編碼單獨的位到VB.net的多個問題。 – 2010-11-09 18:38:03

回答

1

你還沒有澄清如果VB代碼是一個進程外COM服務器,或者是一個客戶端使用C++ inproc COM對象。

如果VB代碼是客戶端,您可以使用將其構建爲VB.Net可執行文件,使用COM引用指向coclass,或者如果您不希望在構建過程中註冊C++對象,您可以使用類型庫上的TlbImp工具生成託管的互操作程序集以從VB.Net代碼引用。

如果你的VB.Code是一個進程外的COM服務器,你必須用COMVisible屬性標記你想要通過COM進行授權的類,然後使用RegAsm工具向COM註冊你的程序集。

另一種替代方法是編譯的C++代碼爲託管C++,並從VB代碼作爲標準管理組件參照的文它。這種方法的優點是你可以完全繞過COM互操作層並完全保留在託管的世界中,這有一定的完美優勢。而另一方面,有兩個缺點 - 一)你的C++代碼將只能訪問特定的客戶端,除非你把它放在GAC,和b)編寫託管C++西港島線需要有點斜升的。我不認爲第一個會影響到你,在你的情況這聽起來是COM僅使用從VB6代碼跨越到一個較低的水平C++的便捷方式。然而,第二個可能會給你一些麻煩。

更新:根據您的評論更新,似乎實際上您有一個直接從VB代碼調用的C++代碼,而該代碼又是通過來自其他客戶端的COM調用的。

如果確實如此,那麼我的建議是將VB6代碼重新編譯爲VB.Net(並且您可能必須對代碼進行一些更改,因爲這兩個平臺並非完全相同),以及其暴露在使用標記有ComVisible特性作爲COM對象,並使用P/Invoke來消耗電流C++代碼(這是相當類似的方式目前你的VB6代碼消耗它)。不應該需要將C++重新編譯爲託管C++組件。

+0

唯一認爲我知道的是,vb6使用私有聲明函數x_ImageType Lib「xImage.dll」加載dll,該函數使用C++編譯,其他應用程序調用這些VB6函數。我嘗試了Tlbimp C++,但它沒有工作消息是它不是一個有效的庫 – Alex 2010-11-09 05:41:52

+0

這很可能意味着VB可執行文件是一個使用C++ COM類的客戶端。 – 2010-11-09 05:44:34

+0

我認爲你是對的,它正在消耗 – Alex 2010-11-09 05:47:38

1

好吧,你似乎有一個小小的誤解。 .net是與COM/VB完全不同的環境。它們就是所謂的非託管代碼,而.NET則是託管的。你可以通過一個叫做InterOp的調用(並且有很多類型的)。

首先vb6 - 要將其轉換爲.net,您需要重新編碼應用程序。 .net不是VB。雖然語言是相似的。

.net不活動X也可以。你不能只是重新編譯一個c + + dll(com或以其他方式到.net)。然而,C++的特殊版本稱爲託管C++,它在託管代碼和非託管代碼之間存在。

您有以下選擇。

  1. 重新編碼的VB程序,並使用COM互操作從vb.net訪問現有的COM對象
  2. 重新編碼VB程序和重新編碼COM功能(或者託管C++或重新編碼到VB.net)以完全。 net
  3. 保留VB程序並將COM功能(託管C++或重新編碼爲VB.net)重新編碼爲完全.net,並使用.net的功能公開COM接口。
  4. 獨自離開
+0

我可以用C++重新編譯C++嗎?然後寫一些在vb.net或c#到這個DLL?或者我需要重新編寫整個C++程序? – Alex 2010-11-09 05:51:36

+0

沒有Active X功能需要在MC++中獲得託管C++包裝器。 – 2010-11-09 06:06:47

+0

VB6可以通過VB.Net升級嚮導半自動升級到VB.Net。有第三方工具聲稱以非常高的精度自動將VB6升級到VB.Net。 – MarkJ 2010-11-10 09:55:06

1

所有這聽起來好像你的C++ DLL是一個普通的DLL(不COM),它是使用Declare語句VB6的訪問。

您有兩種選擇。

  • 您可以使用P/Invoke直接從.Net調用C++ DLL。 C++不需要更改代碼,您可以使用現有的DLL。您可以使用P/Invoke Interop Assistant自動生成C++頭文件中的P/Invoke代碼。
  • 如果你願意改變C++,你也可以使用C++ Interop,這被認爲不太繁瑣的實現。
+0

我有零C++技能,所以我怎麼知道C++ DLL是普通的而不是COM。在這種情況下,使用P/invoke – Alex 2010-11-09 21:36:54

+0

您在別處說過,VB6使用'Declare Function'加載C++ DLL,這意味着C++ DLL必須是普通的DLL而不是COM。你需要VB.Net中的一些P/Invoke聲明。您可以(i)將VB6'Declare'轉換爲VB.Net'Declare',我認爲您必須手動執行或(ii)找到C++函數聲明,將其複製並粘貼到* P/Invoke Interop助理*,然後它會爲您生成VB.Net聲明或(iii)如果只有一個或兩個'Declare'語句,您可以在這裏發佈它們,我們可能可以將它們轉換爲您:) – MarkJ 2010-11-10 09:52:47