Эта проблема может частично работаться вокруг. Код исключения Платформы загружает сообщения об ошибках из своих ресурсов, на основе локали текущего потока. В случае некоторых исключений это происходит в то время, когда к Свойству сообщения получают доступ.
Для тех исключений, можно получить полную американскую английскую версию сообщения путем краткого переключения локали потока на en-США при входе его (сохранение исходной пользовательской локали заранее и восстановление его сразу впоследствии).
Выполнение этого на отдельном потоке еще лучше: это гарантирует, что не будет никаких побочных эффектов. Например:
try
{
System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString()); //Will display localized message
ExceptionLogger el = new ExceptionLogger(ex);
System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
t.Start();
}
, Где класс ExceptionLogger смотрит что-то как:
class ExceptionLogger
{
Exception _ex;
public ExceptionLogger(Exception ex)
{
_ex = ex;
}
public void DoLog()
{
Console.WriteLine(_ex.ToString()); //Will display en-US message
}
}
Однако как Joe правильно указывает в комментарии к более раннему пересмотру этого ответа, некоторые сообщения уже (частично) загружаются из ресурсов языка в то время, когда исключение выдается.
Это относится к 'параметру, не может быть пустая' часть сообщения, сгенерированного, когда ArgumentNullException ("нечто") исключение брошен, например. В тех случаях сообщение будет все еще казаться (частично) локализованным, даже когда с помощью вышеупомянутого кода.
Кроме при помощи непрактичных взломов, таких как выполнение всего Вашего кода неUI потока с локалью en-США для начала, там, кажется, не очень, можно сделать об этом: код исключения Платформы.NET не имеет никаких средств для переопределения локали сообщения об ошибке.
Я вообразил бы один из этих подходов:
1) исключения только когда-либо читаются Вами, т.е. они не клиентская функция, таким образом, можно использовать соединенный проводами не локализованные строки, которые не изменятся, когда Вы будете работать в турецком режиме.
2) Включают код ошибки, например, 0X00000001 с каждой ошибкой так, чтобы можно было легко посмотреть он в в английской таблице.
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US");
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
try
{
System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString())
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;
Без ОБХОДНЫХ РЕШЕНИЙ.
Спасибо:)
Вы должны регистрировать стек вызовов, а не просто сообщение об ошибке (IIRC, простое исключение. ToString () должен сделать это за вас). Отсюда вы можете точно определить, откуда возникло исключение, и, как правило, определить, какое это исключение.