2012-08-13 34 views
0

這是一個關於設計方法的問題。我有限的COM經驗和一點WCF經驗。我的約束由應用程序環境給出,但我有一些設計靈活性。如何從VB6 DLL中打開WPF exe文件?

從VB6 DLL中,我需要啓動,並與WPF應用程序通信。 WPF應用程序目前是一個exe文件,但如果有幫助的話,我可以讓它成爲一個圖書館。我想提供VB6 DLL和WPF應用程序之間的雙向通信。我有一些靈活性來調整VB6 DLL的設計。

我正在開發使用VS2010 C#和.NET 4

多少成分,我應該使用?我可以用VB6 DLL啓動WPF應用程序In-Proc嗎?他們之間應該有第三個組件嗎? COM +可以發揮有用的作用嗎?我是否必須使整個WPF應用程序COM可見?有沒有這樣做的缺點?

我正在尋找一種可以原型設計的方法。我願意研究細節。

+0

我真的不明白這不是一個真正的問題。 – 2012-08-13 22:32:53

回答

1

  1. 創建從WPF應用程序,使用WCF的Web服務。我會抽象出應該遠程訪問的WPF應用程序的那些方面。這將明確地而不是包括任何用戶界面代碼。
  2. 我會創建一個簡單的類庫項目,並使用「添加服務引用」來添加對WCF服務的引用。
  3. 我會做的類庫的方法COM可見
  4. 我會打電話從VB6

這樣將移除式用戶界面的任何考慮的利益的方法。

+0

參考你的評論,這對我來說是一個真正的問題。 – JimBoone 2012-08-13 23:20:12

+0

爲了便於說明,您建議添加第三個公開COM方法調用的組件,並通過服務通道與WPF應用程序進行通信。我有這個權利嗎? – JimBoone 2012-08-13 23:25:24

+0

什麼啓動Web服務?這整套東西運行在個人用戶盒子上。 Web服務在訪問時是否啓動? – JimBoone 2012-08-13 23:27:43

1

在可用的選項中,我喜歡COM選項而不是'啓動另一個進程'選項,因爲這種簡單性使得'應用程序'間通信將通過方法調用而不是WCF或任何類似的方式進行。

我假設你的VB DLL生活在一個window'd過程中,而不是一個服務或Web應用程序。您只需將所有暴露的類型標記爲COM可見,即類,它們的參數和返回類型。

您可能必須在Windows窗體ElementHost [1]內包裝您的WPF UI,但我不確定,試試看。

我不確定如果您在搜索中看到這個[2],它聽起來可以但不支持,只要你沒有太多的事情發生。

[1] http://msdn.microsoft.com/en-us/library/system.windows.forms.integration.elementhost.aspx

[2] http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7555ba6a-1359-4dfe-aa23-c31a8f121142/

0

我在一個主要用VB6編寫的應用程序上工作,但是大多數最近的代碼都是用.net編寫的,並且內置了WPF和一些WinForms的UI組件。這個應用程序的數據源是WCF,MSSQL服務器和一個基於UNIX的服務器。所有的WCF調用都是由.net UI組件引用的數據訪問組件構成的。

您可以在VB6窗口或其他容器控件中託管WPF。首先獲取Interop Forms Toolkit並構建shell用戶控件來託管您的WPF控件。

爲了能夠在這些控件中託管WPF,您需要構建一個包含ElementHost的WinForms用戶控件,該控件可以將內容設置爲WPF用戶控件。

WPF用戶控件

元主機
一個
的WinForms內內用戶控件
一個
VB6用戶控件或 窗口內

互操作的工具包將要建設VB.Net代碼,但你可以在C#中完成,雖然我沒有嘗試過。由interop工具包創建的用戶控件將作爲COM組件公開,您可以通過Project> Components將它們添加爲組件,然後在工具箱中找到它們。在數據源(WCF,數據庫)等方面,您應該在.net組件中構建所有的數據訪問,直接從UI組件引用,不要嘗試回調到VB6庫,您可能只需要創造一個混亂。

在我的應用程序中,我還有一個配置部分,我從VB6應用程序啓動中調用,它爲所有.net組件設置IoC容器。

從最佳實踐方法,我實際上會建議您將VB6代碼重寫爲.net並將VB6置於畫面之外。如果這不是一個選項,那麼你有很多選擇,我的解釋只是其中的一個。