2009-11-27 157 views
2

我有一個用VC++ 6編寫的原生動態鏈接庫,我沒有訪問源代碼的權限。我想將其轉換爲託管代碼,以便C#可以調用此庫。問題在於VC6庫大量使用std :: vector和std :: string作爲函數參數,並且沒有辦法將這些類型直接封裝到C#中。如何從C#調用原生VC++ 6庫(使用std :: string作爲參數)#

所以我需要的是VC6和C#之間的橋樑,並且我爲VC++ 6實現了一個VC++ 2005包裝器。但是,我從回覆(通過jalf)意識到以下線程:「VC++ 6和VC++ 2005有不同的std :: string定義(並且編譯器也可能插入不同的填充和其他更改),結果是垃圾,和/或不可預知的行爲和崩潰「。

Passing std::string from VC++2005 to VC++6 DLL results in garbage

所以現在,最大的問題是,我怎麼能調用從C#在VC++ 6本地庫?

我很茫然,任何幫助,非常感謝。

回答

2

如果您有權訪問VC++ 6,請編譯「bridging/wrapper」dll。然後,暴露功能類型,你可以P /從C#調用,如Char *等。

順便說一句, 您可能可以在eBay上獲得「使用」許可證或廉價的東西。

編輯:
下面是你問一個示例代碼(我想...):

[System.Runtime.InteropServices.DllImport("somedll.dll")] 
public static extern int Fun1(int n, IntPtr[] lpNames); 


////////////////////////////////////////////////////////////////////////// 
List<string> strList = new List<string>(); 

IntPtr[] strPointerArr = new IntPtr[strList.Count]; 
for(int i=0; i<strList.Count; ++i){ 
    strPointerArr[i] = System.Runtime.InteropServices.Marshal.StringToHGlobalUni(strList[i]); 
} 
Fun1(strList.Count, strPointerArr); 

////////////////////////////////////////////////////////////////////////// 
+0

這聽起來像在第一個很好的解決方案,但你如何轉換這種複雜類型std :: vector 到其他可以從C/P調用的東西? – Lopper 2009-11-27 01:49:22

+0

如果你只需要傳遞它,'const char **'(即chars的動態數組的動態數組)就可以做到這一點(使用'CoTaskMemAlloc',並要求調用者釋放它)。 – 2009-11-27 01:53:52

+0

另一種方式,在VC++ 6中編寫的「橋接/包裝器」dll想要將char **傳遞迴C#?在這種情況下,內存不能被釋放,因爲C#不能這樣做。 – Lopper 2009-11-27 02:09:35

相關問題