2011-10-01 60 views
0

我想用P/Invoke從C#中的非託管C++ DLL中調用函數。 C++的DLL使用CString的作爲函數參數和返回時,如用CString的PInvoke

CString AFX_EXT_API GetUserName(CString& userID) 

不幸的是,C++是遺留代碼我不能改變使用更普遍LPSTR(或甚至char *)。

有什麼辦法可以將CString編組爲一個.NET兼容對象嗎?或者以某種方式裝飾一個.NET char[]被封送到一個CString?

回答

3

您無法在託管代碼中創建CString。很顯然,您需要在託管代碼和本機代碼之間增加一層。

這使您有機會創建一個位於之間的C++/CLI DLL。您可以從您的託管程序集調用此代碼而不需要P/invoke。從C++/CLI中間層,您可以創建一個CString

但是,有一個警告。您必須使用與原生DLL相同的C++運行時。這可能是可能的,但它很可能是一個絆腳石。例如,如果DLL是使用MSVC6編寫的,那麼您將需要使用MSVC6構建您的中間層,並排除C++/CLI。在這種情況下返回P/invoke和char*

我會強調,導出基於CString的DLL接口是非常糟糕的做法,我會尋找DLL的替代品。

+0

該DLL包含了花費更長時間轉換爲.NET的關鍵業務邏輯。 我同意,首先導出一個CString的DLL函數是一個壞主意,但遺留代碼是在15年前編寫的。它絕對可以將未來發展置於視野之中。 – johnluetke

1

如果你不能改變DLL本身,很明顯的選擇是編寫一個接受char []的代理DLL,分配一個CString然後調用DLL。