.NET 4.6.2引入的System.Web.Globalization命名空间在运行时与System.Globalization

时间:2016-08-08 11:37:54

标签: asp.net .net vb.net .net-4.6.2

在周末安装Windows 10周年更新(包括.NET Framework 4.6.2)后,一些代码停止工作。我已经回到1周前的版本,以确保它与我们的代码无关。

在运行时,会抛出错误:

  

错误BC30561:'全球化'是不明确的,从名称空间或类型&System;系统' 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建议可以简化&#34;名称&#34;,表示System不是必需的。

在违规行设置断点时,我可以通过立即窗口获得相同的错误:

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

如果我理解正确,则System.GlobalizationSystem.Web.Globalization都有。根据{{​​3}},引入了一个新的命名空间,这似乎导致了这个问题。

+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 个答案:

答案 0 :(得分:7)

Bug Crusher的回答是正确的。要解决Stijn对答案的评论,只需在项目中搜索“全球化”。并删除它的每个实例。我不会使用Find + Replace来执行此操作,因为这可能会产生意想不到的副作用。

然后确保您编辑的每个文件都有正确的导入或使用语句。

VB-     进口System.Globalization

C# -     使用System.Globalization;

这就是VS提出的解决办法。

答案 1 :(得分:3)

我们删除了“全球化”。并让Visual Studio提出修复。我们选择了“Import System.Globalization”,它已添加到我们的文件中。

这解决了错误,网站运行正常。