在C#中将char*转换为字符串

11
我正在调用一个来自本机DLL的函数,该函数返回一个char*指针,我应该如何将返回的指针转化为字符串? 我尝试过以下方法:

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

但它返回了一个奇怪的中文字符,这不是c的正确值。


6
请确保变量 c 指向 Unicode(UTF-16)数据。 - Michael Liu
我正在调用一个本地 DLL 中的函数,该函数返回一个 char* 类型的 "hi"。但由于某种原因,转换后的字符串并不是 "hi"。 - method
3
你没有发布任何可用于帮助你的内容。“我有一个东西(但我不会告诉你它是什么),当我做这件事时,它返回了我意料之外的结果(但我也不会告诉你那是什么)。” 发布外部函数声明、在 C# 中使用的导入语句以及调用该函数的代码(包括变量声明),也许会有人能够帮助你。就目前而言,这真的只是瞎猜。 - Ken White
2
你是如何接收这个char的?它来自于一个通过P/Invoke调用的非托管(本地)DLL吗?如果是这种情况,你的P/Invoke声明可能需要进行调整,以便框架的编组器为您完成此操作。请记住,在C#中的char和C/C++中的char并不相同:在C#中的char实际上是在C++中的wchar_t*。 - xxbbcc
4个回答

21
也许本地 DLL 实际上返回的是 ANSI 字符串而不是 Unicode 字符串。在这种情况下,调用 Marshal.PtrToStringAnsi:
using System.Runtime.InteropServices;
...
string s = Marshal.PtrToStringAnsi((IntPtr)c);

谢谢,解决了我的问题。很抱歉没有提供足够的信息。 - method
在我的情况下,我需要做一点改变:Marshal.PtrToStringAuto((IntPtr)c),然后它就可以工作了。 - psulek

2

请更新您的外部函数的P/Invoke声明,如下所示:

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

这样做可以避免在获取指针后进行额外的工作。


在我的情况下,它没有起作用。我不得不使用@michael liu的Marshal答案。您的答案仍然在之后尝试释放内存,这会导致我正在处理的类型出现问题。 - Nordes

1

你的例子不是很清楚,但是你的评论表明你正在从C#调用C++ DLL。你需要返回一个BSTR,而不是char *或字符串。

我建议你从这个问题/答案开始,当我需要执行这个操作时,我也使用了它:

如何从本地(C ++)代码返回文本


0
public static void Main(string[] args)
        {
            var charArray = new[] {'t', 'e', 's', 't'};
            fixed (char* charPointer = charArray)
            {
                var charString = new string(charPointer);
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接