Мой код:
System.Resources.ResourceManager resourceManager = GetResourceManager();
string str = resourceManager.GetString("delete", new CultureInfo(1033));
В текущем проекте, скомпилированном в .NET 2.0, все работает как исключено. Переменная str содержит строку ресурса для LCID 1033 - Удалить , это нормально.
Сейчас мы обновляем систему до .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 с ненулевыми параметрами GetString ("delete", new CultureInfo (1033)) .
Эта ошибка похожа на System.ArgumentNullException в System.Threading.Monitor.Enter . Может быть, какая-то ошибка в Monitor.Enter или что-то еще?
Обновление:
Когда я смотрю в отладчике на объект resourceManager.ResourceSets.Items[2].Value.Table["delete"]
, то он содержит строковое значение «Удалить». свойство Items [2] здесь указывает на LCID 1033. Это означает, что менеджер ресурсов уже содержит локализованную строку для ключа ресурса delete на языке 1033 . Кто-нибудь знает, где может быть ошибка?