Пространство имен System.Web.Globalization, представленное с конфликтами.NET 4.6.2 во время выполнения с System.Globalization

После установки обновления для Windows 10 Anniversary Update в выходные дни, в который входит.NET Framework 4.6.2, некоторый код перестает работать. Я вернулся к версии 1 недели назад, чтобы убедиться, что это не связано с нашим кодом.

Во время выполнения возникает ошибка:

ошибка BC30561: "Глобализация" неоднозначна, импортируется из пространств имен или типов "System.Web, System".

Трассировки стека:

System.Web.HttpCompileException (0x80004005): C:\path\to\project\MasterPages\SiteMaster.master(71): error BC30561: 'Globalization' is ambiguous, imported from the namespaces or types 'System.Web, System'.
   at System.Web.Compilation.BuildManager.PostProcessFoundBuildResult(BuildResult result, Boolean keyFromVPP, VirtualPath virtualPath)
   at System.Web.Compilation.BuildManager.GetBuildResultFromCacheInternal(String cacheKey, Boolean keyFromVPP, VirtualPath virtualPath, Int64 hashCode, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
   at System.Web.Compilation.BuildManager.GetVPathBuildResult(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean ensureIsUpToDate)
   at System.Web.UI.BaseTemplateParser.GetReferencedType(VirtualPath virtualPath, Boolean allowNoCompile)
   at System.Web.UI.PageParser.ProcessMainDirectiveAttribute(String deviceName, String name, String value, IDictionary parseData)
   at System.Web.UI.TemplateParser.ProcessMainDirective(IDictionary mainDirective)

Это оскорбительная линия:

$.SetLanguage("<%= Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName %>");

Замена Globalization на System.Globalization устраняет проблему, но Visual Studio предлагает, чтобы "имя было упрощено", что указывает на то, что System не нужна.

Когда вы устанавливаете точку останова на линии нарушения, я могу получить ту же самую ошибку через окно "Немедленное":

Globalization.CultureInfo.CurrentUICulture
error BC30560: 'CultureInfo' is ambiguous in the namespace 'System.Globalization'.

Если я правильно понимаю, есть и System.Globalization и System.Web.Globalization. Согласно API diff, было введено новое пространство имен, которое, похоже, вызывает эту проблему.

+namespace System.Web.Globalization {
+    public interface IStringLocalizerProvider {
+        string GetLocalizedString(CultureInfo culture, string name, params object[] arguments);
+    }
+    public sealed class ResourceFileStringLocalizerProvider : IStringLocalizerProvider {
+        public const string ResourceFileName = "DataAnnotation.Localization";
+        public ResourceFileStringLocalizerProvider();
+        public string GetLocalizedString(CultureInfo culture, string name, params object[] arguments);
+    }
+    public static class StringLocalizerProviders {
+        public static IStringLocalizerProvider DataAnnotationStringLocalizerProvider { get; set; }
+    }
+}

Почему эта ошибка появляется только во время выполнения? Как я могу сделать это сбоем во время компиляции?

Ответы

Ответ 1

Ответ ошибки дробилки правильный. Чтобы обратиться к комментарию Stijn к ответу, просто найдите свой проект для "Глобализации". и удалите все его экземпляры. Я бы не использовал Find + Replace для этого, поскольку это может иметь непреднамеренные побочные эффекты.

Затем убедитесь, что у каждого редактируемого файла есть правильный импорт или использование инструкции сверху.

VB- Импорт системы. Глобализация

С# - использование System.Globalization;

Что бы исправить VS предложил бы.

Ответ 2

Мы сняли "глобализацию". и пусть Visual Studio предложит исправление. Мы выбрали "Import System.Globalization", который он добавил в файл для нас.

Это избавило от ошибки, и сайт работает нормально.