Как процесс .NET получает информацию о культуре? - PullRequest
3 голосов
/ 17 ноября 2009

У меня запущена служба Windows (C #, .NET 2.0) в Windows Server 2003 R2. На одном сервере System.Threading.Thread.CurrentThread.CurrentCulture - это {en-AU}, а на другом {en-US}. Это вызвало разницу при вызове ToString () для объекта DateTime . Я хочу, чтобы культура была {en-AU}.

Я проверил "Региональные и языковые настройки". На обоих серверах на вкладке «Региональные параметры» отображается «Английский (Asutralia)». Но на вкладке «Дополнительно» он показывает «английский (США)» для одного и «английский (Австралия)» для другого. Так что это должно быть причиной разницы. Хотя я хочу знать, почему именно на вкладке «Дополнительно» отображается «языковая версия не-Юникодных программ, которые вы хотите использовать», я подумал, что процессы .NET были Unicode и не должны зависеть от этого.

Как среда выполнения .NET определяет используемую культуру? Любая подробная ссылка будет полезна.

Ответы [ 3 ]

8 голосов
/ 17 ноября 2009

Если культура не была установлена ​​в потоке, Thread.CurrentThread.CurrentCulture по умолчанию - «культура пользователя по умолчанию», которую он получает из базовой ОС. Это определяется разделом «Форматы» в апплете региональной панели управления.

Для службы у нее нет настроек панели управления по умолчанию, как для пользователя (в приведенном выше случае), поскольку она работает под учетной записью LocalSystem, у которой не будет профиля, поэтому она использует языковой стандарт системы из ОС. Я не уверен, что это можно сделать для службы, изменив настройки в Windows.

Есть несколько вещей, которые вы можете сделать:

  1. вы можете явно установить CurrentCulture основного потока при запуске службы. Если вы сделаете это, вам нужно будет помнить, что любые новые потоки, созданные в вашем сервисе, также должны будут иметь также установленный CurrentCulture, поскольку потоки не наследуют свою культуру от родительских потоков.

  2. вы можете настроить службу для запуска от имени определенного пользователя и установить региональные настройки этого пользователя (раздел форматов) в соответствии с культурой, которую вы хотите использовать. Когда служба запускается таким образом, она использует региональные настройки этого пользователя.

  3. , поскольку ваша проблема связана с вызовом DateTime.ToString(), убедитесь, что вы передали культуру AU методу ToString():

    DateTime.ToString(new CultureInfo("en-AU"))
    

    Вы можете добавить это как метод расширения, чтобы избавить вас от необходимости делать это везде:

    public static string ToAUString(this DateTime dateTime)
    {
        return dateTime.ToString(new CultureInfo("en-AU"));
    }
    

    Затем вы можете позвонить DateTime.ToAUString(), чтобы получить правильный вывод.

3 голосов
/ 17 июля 2013

В моем случае для изменения культуры потребовалась всего одна строка кода:

System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo( "en-US" )

Изменяет стандартную культуру основного потока, а также новые.

1 голос
/ 17 ноября 2009

Эта страница MSDN на CultureInfo содержит некоторую информацию, которая может иметь значение:

Пользователь может переопределить некоторые значения, связанные с текущей культурой Windows, в разделе региональных и языковых параметров панели управления. Например, пользователь может выбрать отображение даты в другом формате или использовать валюту, отличную от значения по умолчанию для культуры. В общем, ваши приложения должны учитывать эти переопределения пользователей.

Если UseUserOverride имеет значение true, и заданная культура соответствует текущей культуре Windows, CultureInfo использует эти переопределения, включая пользовательские настройки для свойств экземпляра DateTimeFormatInfo, возвращаемых свойством DateTimeFormat, и свойств экземпляра NumberFormatInfo, возвращаемых объектом Свойство NumberFormat. Если пользовательские настройки несовместимы с культурой, связанной с CultureInfo, например, если выбранный календарь не является одним из OptionalCalendars, результаты методов и значения свойств не определены.

Я думаю, что это может быть хорошей отправной точкой для ваших расследований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...