Пространство имен 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
не обязательно.
Устанавливая точку останова на ошибочной строке, я могу получить ту же ошибку через Immediate Window:
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; } + } +}
Почему эта ошибка появляется только во время выполнения? Как я могу заставить его потерпеть неудачу во время компиляции?
2 ответа
Bug Crusher ответ правильный. Чтобы ответить на комментарий Стейна к ответу, просто поищите в своем проекте "Глобализация". и удалить каждый экземпляр этого. Я бы не использовал Find + Replace для этого, так как это может привести к непреднамеренным побочным эффектам.
Затем убедитесь, что каждый файл, который вы редактировали, имеет правильный импорт или использование оператора в верхней части.
VB- Система импорта. Глобализация
C#- использование System.Globalization;
Это исправление, которое VS предложил бы.
Мы удалили "Глобализацию". и позвольте Visual Studio предложить исправление. Мы выбрали "Импорт System.Globalization", который он добавил в файл для нас.
Это избавило от ошибки и сайт работает нормально.