2009-11-16 2 views
3

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

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

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

ответ

8

Если культура не установлена ​​в потоке, то 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(), чтобы получить правильный вывод.

+0

В этом случае служба (на самом деле хостинг-служба WCF) работает под определенной учетной записью пользователя службы. Но я установил ту же учетную запись для службы на другой машине для тестирования, и она вела себя правильно. Его только на машине, которая имеет «английский (США)» на расширенной вкладке, служба не ведет себя правильно. – softveda

+0

Мне удалось войти в систему как учетная запись службы в машине, а формат «Английский (США)». Таким образом, профиль пользователя неверен. Это не связано с вкладкой «Дополнительно». Спасибо за указание на правильное направление. – softveda

1

Это MSDN page на CultureInfo имеет некоторую информацию, которая может иметь отношение:

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

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

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

3

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

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

Он изменяет по умолчанию Культура основных нитей и новых, а также.

+2

Примечание: это [доступно только с .NET 4.5] (http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.defaultthreadcurrentuiculture%28v=vs.110%29.aspx)! Перед этим вам нужно будет настроить культуру вручную на каждый созданный вами поток. – Abel

Смежные вопросы