アンマネージド文字列をマネージド文字列にすばやく変換できる関数を探しています。を見ていました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);
}
この代替手段ははるかに高速に見えます。そもそも Microsoft が PtrToStringAnsi 関数をコーディングしなかった理由はありますか? 私はおそらく何か重要なものを見逃しています...