При запуске приложения или попытке доступа на веб-узел с компьютера, на котором установлено обновления для .NET Framework 2.0, отображается ошибка: "Имя культуры 'Culture' не поддерживается"


Проблема


На компьютере под управлением Microsoft Windows Server 2003 необходимо установить обновление для Microsoft .NET Framework 2.0, описанное в следующей статье базы знаний Майкрософт:
928365 Описание обновления безопасности для .NET Framework 2.0 для Windows Server 2003, Windows XP, and Windows 2000: 10 июля 2007 г.
При запуске приложения или попытке доступа на веб-узел с компьютера может появиться сделдующее сообщение об ошибке:
[System.ArgumentException] : Имя культуры 'Culture' не поддерживается для следующих 13 культур: en-CB az-AZ-Latn uz-UZ-Latn sr-SP-Latn az-AZ-Cyrl uz-UZ-Cyrl sr-SP-Cyrl bs-BA-Cyrl sr-BA-Latn sr-BA-Cyrl bs-BA-Latn iu-CA-Latn div-MV
Кроме того, если приложение обладает источниками, использующими устаревший формат имени культуры, и если имя культуры пользователя использует новый формат имени культуры, приложение не сможет найти источники для старого формата имени культуры.

Причина


Обновление, упоминавшееся в разделе «Проблема», является накопительным обновлением для .NET Framework 2.0. Это обновление включает изменения имен культур. Новые имена культур соответствуют синтаксису стандартов проблемной группы проектирования Интернета (IETF) (RFC 4646 и RFC 4647). Изменение имен культур улучшает возможность взаимодействия, так как каждый язык теперь имеет постоянный идентификатор.

Сопоставление старых имен культур с новыми именами культур следующее:
Старое имя культурыНовое имя культуры
az-AZ-Latnaz-Latn-AZ
uz-UZ-Latnuz-Latn-UZ
sr-SP-Latnsr-Latn-CS
az-AZ-Cyrlaz-Cyrl-AZ
uz-UZ-Cyrluz-Cyrl-UZ
sr-SP-Cyrlsr-Cyrl-CS
bs-BA-Cyrlbs-Cyrl-BA
sr-BA-Latnsr-Latn-BA
sr-BA-Cyrlsr-Cyrl-BA
bs-BA-Latnbs-Latn-BA
iu-CA-Latniu-Latn-CA
div-MVdv-MV
en-CBen-029

Временное решение


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

Примечание. Для того чтобы использовать программу-пример, приведенную здесь, необходимо, чтобы на компьютере был установлен .NET Framework 2.0.
  1. Создайте приложение, которое может быть использовано для создания пользовательской культуры. Для этого выполните следующие действия:
    1. Выберите в меню Пуск пункт Выполнить, введите команду notepad и нажмите кнопку .
    2. Запустите программу «Блокнот» и скопируйте в окно редактора приведенный ниже код.
      using System;
      using System.Globalization;

      public class MakeCultures
      {
      static void Main()
      {
      CreateCopyCulture("en-029", "en-CB");
      CreateCopyCulture("az-Latn-AZ", "az-AZ-Latn");
      CreateCopyCulture("uz-Latn-UZ", "uz-UZ-Latn");
      CreateCopyCulture("sr-Latn-CS", "sr-SP-Latn");
      CreateCopyCulture("az-Cyrl-AZ", "az-AZ-Cyrl");
      CreateCopyCulture("uz-Cyrl-UZ", "uz-UZ-Cyrl");
      CreateCopyCulture("sr-Cyrl-CS", "sr-SP-Cyrl");
      CreateCopyCulture("bs-Cyrl-BA", "bs-BA-Cyrl");
      CreateCopyCulture("sr-Latn-BA", "sr-BA-Latn");
      CreateCopyCulture("sr-Cyrl-BA", "sr-BA-Cyrl");
      CreateCopyCulture("bs-Latn-BA", "bs-BA-Latn");
      CreateCopyCulture("iu-Latn-CA", "iu-CA-Latn");
      CreateCopyCulture("dv-MV", "div-MV");


      }

      static void CreateCopyCulture(string strRealName, string strAliasName)
      {
      try
      {
      // Create a new culture based on the old name
      CultureAndRegionInfoBuilder carib = new CultureAndRegionInfoBuilder(
      strAliasName, CultureAndRegionModifiers.None);

      carib.LoadDataFromCultureInfo(new CultureInfo(strRealName));
      carib.LoadDataFromRegionInfo(new RegionInfo(strRealName));

      carib.Register();

      // Change the existing culture's parent to the old culture
      carib = new CultureAndRegionInfoBuilder(strRealName,
      CultureAndRegionModifiers.Replacement);

      carib.Parent = new CultureInfo(strAliasName);
      carib.Register();

      // Verify they're registered...
      CultureInfo ci = new CultureInfo(strAliasName);
      Console.WriteLine("Aliased culture {0} has parent of {1}.", ci, ci.Parent);
      ci = new CultureInfo(strRealName);
      Console.WriteLine("\"Real\" culture {0} has parent of {1}.", ci, ci.Parent);
      }
      catch (Exception e)
      {
      Console.WriteLine("Unable to create custom culture " + strAliasName);
      Console.WriteLine(e);
      }
      }
      }
      Примечание. Эта программа-пример задает родителей новых культур родителями старых культур. Родители старых культур не могут быть одновременно родителями новых культур, так как эта ситуация приведет к бесконечной рекурсии в течение поиска источника.

    3. В меню Файл выберите команду Сохранить как.
    4. В диалоговом окне Сохранить как выберите Мой документ, введите MakeCultures.cs в поле Имя файла, щелкните Все файлы в поле Тип файла, а затем щелкните Сохранить.
    5. Закройте приложение «Блокнот».
  2. Запустите созданное приложение для создания пользовательской культуры. Для этого выполните следующие действия:
    1. Выберите в меню Пуск пункт Выполнить, введите команду cmd и нажмите кнопку ОК.
    2. Введите команду cd "Мои документы" и нажмите клавишу ВВОД.
    3. Введите %windir%\Microsoft.NET\Framework\v2.0.50727\csc /r: sysglobl.dll MakeCultures.cs и нажмите клавишу ВВОД.
    4. Чтобы создать культуру, введите MakeCultures.exe для запуска программы.

Статус


Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в разделе «Информация в данной статье применима к».