Я пытаюсь получить все сообщения Exception
на английском языке, независимо от того, на каком языке работает моя программа.
Мне удалось получить почти все сообщения об исключениях на английском языке, используя ответы из следующих сообщений:
Исключить сообщения на английском языке?
и другое другое решение, которое я нашел (например, использование отражения для изменения значения по умолчанию CultureInfo
).
У меня есть особая проблема с SocketException
. Независимо от того, что я делаю, я получаю ее на машинный язык по умолчанию.
Я создал тестовую программу, чтобы показать проблему: Эта тестовая программа будет печатать Исключения в языке по умолчанию:
using System;
using System.Text;
using System.Threading;
using System.IO;
using System.Net.Sockets;
using System.Reflection;
using System.Globalization;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
try
{
//I'm not listening on the following port:
TcpClient s = new TcpClient("localhost", 2121);
}
catch (Exception ex)
{
Console.WriteLine("Socket exception: " + ex.Message);
}
try
{
//the following file doesn't exists:
File.ReadAllText("filenotexist.txt");
}
catch (Exception ex)
{
Console.WriteLine("File exception: " + ex.Message);
}
}
}
}
Этот результат на моей машине следующий текст:
H:\Shared>Test-def.exe
Socket exception: No connection could be made because the target machine actively refused it 127.0.0.1:2121
File exception: Could not find file 'H:\Shared\filenotexist.txt'.
На японском компьютере пишут все исключения на японском языке (чего я не понимаю):
Z:\>Test-def.exe
Socket exception: 対象のコンピューターによって拒否されたため、接続できませんでした。 127.0.0.1:2121
File exception: ファイル 'Z:\filenotexist.txt' が見つかりませんでした。
(Японский "выглядит по-другому на японской машине, но при копировании на мою машину он отображается как" \")
Итак, из сочетания ответов, которые я нашел, я применил следующее решение, поэтому теперь оно выглядит так:
namespace TestApp
{
class Program
{
//will change CultureInfo to English, this should change all threads CultureInfo to English.
public static void SetEnglishCulture()
{
CultureInfo ci = new CultureInfo("en-US");
//change CultureInfo for current thread:
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = ci;
//change CultureInfo for new threads:
Type t = typeof(CultureInfo);
try
{
t.InvokeMember("s_userDefaultCulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
t.InvokeMember("s_userDefaultUICulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
}
catch { }
try
{
t.InvokeMember("m_userDefaultCulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
t.InvokeMember("m_userDefaultUICulture", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static, null, ci, new object[] { ci });
}
catch { }
}
static void Main(string[] args)
{
//first thing: set CultureInfo to English:
SetEnglishCulture();
try
{
//I'm not listening on the following port:
TcpClient s = new TcpClient("localhost", 2121);
}
catch (Exception ex)
{
Console.WriteLine("Socket exception: " + ex.Message);
}
try
{
//the following file doesn't exists:
File.ReadAllText("filenotexist.txt");
}
catch (Exception ex)
{
Console.WriteLine("File exception: " + ex.Message);
}
}
}
}
Теперь на японском компьютере записываются исключения на английском языке, но исключения Net.socket все еще находятся на японском языке:
Z:\>Test-en.exe
Socket exception: 対象のコンピューターによって拒否されたため、接続できませんでした。 127.0.0.1:2121
File exception: Could not find file 'Z:\filenotexist.txt'.
Я также проверил некоторые другие исключения, некоторые исключения теперь показаны на английском языке, но не все из них, исключения сокетов являются постоянными. Как вы можете видеть, исключение файла было переведено на английский язык, но исключение сокета все еще находится на японском языке.
Я тестировал его почти в любой платформе .NET(от 2,1 до 4,5), все еще такой же.
- Есть ли полное решение для всех исключений?
- Я что-то пропустил?
- Должен ли я делать что-нибудь еще?
- Может быть, есть другой способ запустить программу на чужой машине и установить некоторую переменную среды, чтобы получить выход на английский язык?