我的代码:
System.Resources.ResourceManager resourceManager = GetResourceManager();
string str = resourceManager.GetString("delete", new CultureInfo(1033));
在 .NET 2.0 下编译的当前项目中,一切正常。变量str包含 LCID 1033 - Delete的资源字符串,这没关系。
我们现在正在升级到 .NET 4.0,在目标框架 .NET 4.0 下重新编译项目。现在编译为 .NET 4.0 程序集,它会抛出异常System.ArgumentNullException,消息值不能为空。。堆栈跟踪:
at System.Threading.Monitor.Enter(Object obj)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
at System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
这里有趣的是堆栈跟踪,它指向ResourceManager.InternalGetResourceSet中的内部框架方法,这会导致调用Monitor.Enter与空对象。但是我用非空参数调用GetString ("delete", new CultureInfo(1033))方法。
此错误似乎类似于System.Threading.Monitor.Enter 中的 System.ArgumentNullException。也许是 Monitor.Enter 中的一些错误,或者其他什么?
更新:当我在调试器中查看对象时resourceManager.ResourceSets.Items[2].Value.Table["delete"]
,它包含字符串值“删除”。此处的属性 Items[2] 指向 LCID 1033。这意味着资源管理器已经包含语言1033中资源键删除的本地化字符串。有谁知道哪里可能出错?