簡體   English   中英

如何在啟用COM interop的DLL中引用WCF服務?

[英]How do you reference a WCF service in a COM interop enabled DLL?

問題摘要 :我有一個C#DLL啟用/可見COM互操作。 此C#DLL具有對WCF服務的服務引用。 當我在C#代碼中實例化WCF服務時,COM interop返回錯誤HRESULT(0x80131509)。

問題詳情
我的解決方案中有三個組件。 第一個是非托管C ++應用程序。 此C ++應用程序需要與WCF服務進行通信。 我決定采用的方法是在C ++應用程序和WCF服務之間建立一個C#中間層。 C#層將啟用COM互操作/可見,以便C ++應用程序可以調用它,C#代碼將處理與WCF服務的通信。 C ++方面永遠不需要了解WCF服務; 就其而言,COM互操作呼叫將是一個黑盒子。

當我嘗試在C#代碼中實例化WCF服務客戶端時出現問題。 為了便於測試,我在C#DLL中創建了一個Test()方法。 調用Test()只會返回一個硬編碼的測試字符串。 這有效。 我能夠啟動C ++應用程序,它通過COM interop調用C#DLL,並返回測試字符串。 HRESULT是S_OK。 現在,如果我通過添加簡單的實例化WCF客戶一行更改測試()方法時,COM互操作調用現在返回的0x80131509的HRESULT。

我唯一的線索是,當我編譯C#DLL時,我收到以下警告:

警告:鍵入庫導出器警告處理'[my WCF service]'。 警告:類型庫導出器遇到的類型派生自泛型類,並且未標記為[ClassInterface(ClassInterfaceType.None)]。 不能為這些類型公開類接口。 考慮使用[ClassInterface(ClassInterfaceType.None)]標記類型,並使用ComDefaultInterface屬性將顯式接口公開為COM的默認接口。

我不知道為什么它會給我一個關於導出WCF服務類型的警告。 我希望通過使用C#中間層,它可以將CCF應用程序中存在的WCF服務隔離開來。

那么在啟用COM /可見的DLL中使用WCF服務的技巧是什么?

經過幾天的痛苦之后,我們發現了一種解決方案,盡管它更像是一種解決方案,而不是真正的解決方案。

當我意識到在嘗試在C#代碼中實例化WCF服務時,我發現了一個線索,引發了一個異常。 在事物的C ++方面捕獲異常( 確切地說CAtlException )並查看HRESULT代碼之后,我確定C ++程序抱怨,因為它無法找到WCF服務綁定。 等等,什么? 有點不相信,我創建了一個.exe.config文件並將其放在與可執行文件相同的目錄中。 .exe.config文件基本上包含來自WCF服務項目的app.config的內容,以及system.serviceModel部分中的另一個client標記,該標記包含指向WCF服務地址的單個endpoint標記。 一切都運行良好。

雖然這對我來說似乎不對。 為什么C ++程序需要知道? 只是從邏輯上思考,C#COM互操作應該將這些知識分開並充當障礙,完全封裝WCF層。 通過強制C ++程序了解底層結構,它破壞了封裝並使一切都變得更加......不優雅。 我完全有可能不知道COM互操作的混亂內部是如何工作的,所以也許這對某人來說都是有道理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM