我正在寻找一种可以快速将非托管字符串转换为托管字符串的函数。我正在看Marshal.PtrToStringAnsi
,但它真的很慢。
我在 .NET 框架源代码中看到以下定义:
public static String PtrToStringAnsi(IntPtr ptr)
{
if (Win32Native.NULL == ptr) {
return null;
}
else if (IsWin32Atom(ptr)) {
return null;
}
else {
int nb = Win32Native.lstrlenA(ptr);
if( nb == 0) {
return string.Empty;
}
else {
StringBuilder sb = new StringBuilder(nb);
Win32Native.CopyMemoryAnsi(sb, ptr, new IntPtr(1+nb));
return sb.ToString();
}
}
}
为了提高我的应用程序的性能,我创建了以下方法,该方法使用更快的 Marshal.PtrToStringAnsi(IntPtr, int) 方法。
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, EntryPoint = "lstrlenA")]
[ResourceExposure(ResourceScope.None)]
internal static extern int lstrlenA(IntPtr ptr);
static public string PtrToString( IntPtr p )
{
if (p == IntPtr.Zero)
return null;
int len = lstrlenA(p);
if (len == 0)
return string.Empty;
return Marshal.PtrToStringAnsi(p, len);
}
这种替代方法似乎要快得多。微软没有对 PtrToStringAnsi 函数进行编码是有原因的吗?我可能错过了一些重要的东西......