Ваш код работал нормально, когда я тестировал его на своей машине. Кстати, есть ли причина, по которой вы бы не предпочли следующий метод, который немного короче и достигает эквивалентной цели:
static void Main()
{
var ex = new Win32Exception(123);
Console.WriteLine(ex.Message);
}
Конечно, под прикрытием Win32Exception
P вызывает в FormatMessage
но, по крайней мере, об этом должны беспокоиться .NET Framework, а не мы.
UPDATE:
Вот как метод Win32Exception.GetErrorMessage
реализован в .NET:
private static string GetErrorMessage(int error)
{
string result = "";
StringBuilder stringBuilder = new StringBuilder(256);
int num = SafeNativeMethods.FormatMessage(12800, NativeMethods.NullHandleRef, error, 0, stringBuilder, stringBuilder.Capacity + 1, IntPtr.Zero);
if (num != 0)
{
int i;
for (i = stringBuilder.Length; i > 0; i--)
{
char c = stringBuilder[i - 1];
if (c > ' ' && c != '.')
{
break;
}
}
result = stringBuilder.ToString(0, i);
}
else
{
result = "Unknown error (0x" + Convert.ToString(error, 16) + ")";
}
return result;
}
где FormatMessage
объявлено так:
[DllImport("kernel32.dll", BestFitMapping = true, CharSet = CharSet.Auto, SetLastError = true)]
public static extern int FormatMessage(int dwFlags, HandleRef lpSource, int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr arguments);