2014-07-17 66 views
0

首先,我很抱歉,如果我已經問過已經有答案的問題。我做了一些研究,但沒有得到我想要的。我是新來的WCF服務,所以請忍受我,所以這裏的情況,我有一個非託管的c + + dll具有複雜的數據類型,如結構,工會也有一些用戶定義的數據類型。我需要的是從wcf服務(c#)連接這個非託管C++。我有這樣兩個選項 1.將複雜類型的非託管C++ dll編組爲c#類型。 2.創建另一個非託管C++ dll,它接受來自我的wcf服務的基本數據類型,並試圖將這些基本數據類型映射到當前C++ dll中的複雜數據類型。WCF服務調用具有複雜數據類型的非託管C++ dll

我想知道哪一個更好的解決方案,我也想知道如何完成第二個選項。如果我錯了,請糾正我。謝謝

回答

0

這取決於你的數據類型有多複雜:如果數據類型不是很複雜,就使用第一個數據類型;如果非常複雜,就像結構數組一樣,您可能需要使用第二個結構。

對於第一種方法,實現很簡單,您只需確保託管端(C#)和非託管端(本機C++)中的數據類型具有相同的佈局,此MSDN Marshaling Data with Platform Invoke舉例說明了如何做到這一點。這很容易實現,但很難調試。比如,如果C#和C#中的結構有一個非常小的差別,比如C#結構中的char字段被映射到C++中的int字段,那麼您的程序就會崩潰並且沒有關於它的詳細信息。編組器就像一個黑盒子,你必須閱讀大量文檔來了解內部發生了什麼。這種方法被稱爲顯式PInvoke

對於第二種方法,首先混合使用C++(C++ \ CLI)DLL項目,而不是本地項目。 C++/CLI可以訪問本地資源和受管資源,因此可以在這裏用作橋樑。基本的,你需要在C++ \ CLI中爲本地C++ DLL實現一個包裝器,這將會有很多實現工作,但是你知道發生了什麼並且更容易調試。這種方法被稱爲C++ Interop(隱式PInvoke)。

由於MSDN說:C++ Interop建議優於顯式PInvoke,因爲它提供更好的類型安全性,實現通常不繁瑣,如果非託管API被修改則更爲寬容,並且使性能增強成爲可能, PInvoke的。