2012-01-27 79 views
4

我從本機DLL調用函數返回一個char*指針,我怎樣才能將返回的指針轉換爲字符串? 我想:char *在C#中的字符串

char* c = function(); 
string s = new string(c); 

,但它只是返回一個奇怪的中國人的性格,這是不是c正確的價值。

+6

確保c指向Unicode(UTF-16)數據。 – 2012-01-27 22:52:08

+0

我在一個本地DLL中調用函數,它返回「hi」作爲char *'。由於某些原因,轉換後的字符串不是「hi」。 – method 2012-01-27 22:59:05

+3

你沒有發佈任何可以用來幫助你的東西。 「我有一些東西(但我不會告訴你它是什麼),當我做這件事時,它會返回一些我不指望的東西(但我也沒有告訴你)」。發佈外部函數聲明,您在C#中使用的import語句以及調用它的代碼(包括變量聲明),也許有人可以提供幫助。事實上,這確實是猜測。 – 2012-01-27 23:05:31

回答

9

也許本地DLL真的返回ANSI字符串而不是Unicode字符串。在這種情況下,調用Marshal.PtrToStringAnsi

using System.Runtime.InteropServices; 
... 
string s = Marshal.PtrToStringAnsi((IntPtr)c); 
+0

謝謝,解決了我的問題。抱歉沒有提供足夠的信息。 – method 2012-01-27 23:13:13

1

你的例子並不完全清楚,但你的評論暗示你正在從c#調用C++ dll。您需要返回一個bstr,而不是char *或字符串。

我想這個問題/答案,當我不得不執行此操作,這在我以前開始:

How to return text from Native (C++) code

2

更新您的P/Invoke外部函數的聲明這樣:

[DllImport ("MyDll.dll", CharSet = CharSet.Ansi, EntryPoint = "Func")] 
[return : MarshalAs(UnmanagedType.LPStr)] 
string Func (...); 

這樣,你不會有你得到的指針後做額外的工作。