Я конвертировал некоторые проекты на основе .NET-3.5 в .NET Framework 4.0 и столкнулся с проблемами со встроенными в сборку строковыми ресурсами.
Код содержит ссылки на строки ресурсов, такие как Resources.ValidationFailedMsg
. Resources
здесь автоматически сгенерированный класс. Полностью определенное имя - MyAssembly.Properties.Resources
(имя сборки MyAssembly.dll, и, для простоты, корневое пространство имен всего в нем также MyAssembly). Папка «Свойства» проекта содержит Resources.resx, где определена строка ValidationFailedMsg (например, «Проверка не удалась!»), И из нее создается файл Resources.Designer.cs.
Теперь давайте запустим эту вещь. Вот что происходит:
System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'MyAssembly.resources ....
Извините, какой файл ???
Во-первых, я понимаю концепцию бинарных .resource файлов и то, как может быть много таких файлов для многих культур, но давайте вначале сработаем с одной культурой по умолчанию. Начиная с .NET 2.0 до 3.5-совместимых версий этого проекта, все строки были встроены в саму сборку, поэтому инфраструктура даже не искала их нигде, кроме MyAssembly.dll. Как сделать так, чтобы он смотрел на сборку, а не смотрел на что-нибудь еще?
Во-вторых, я заметил файл .resource в каталоге bin \ Debug проекта, но он называется MyAssembly.Properties.Resources.resources, а не MyAssembly.resources, и msbuild не копирует его в bin \ Отладка или в любом другом месте, где есть ссылка на MyAssembly. Это полезный намек на то, что здесь может пойти не так?
В-третьих, я могу открыть новый пустой проект в Visual Studio 2010, добавить Resources.resx в свойствах, поместить туда строку, сослаться на нее в коде как TestProject.Properties.Resources.String1, построить, и он будет работать как очарование. Но в старом проекте даже чтение Resource.resx со строками не помогает.
Можете ли вы объяснить, почему .NET 4.0 компилирует эти строки в одно место, а затем ищет их в другом месте, вызывая исключение FileNotFoundException? И как правильно переносить сборку .NET 3.5 с такими встроенными строковыми ресурсами в .NET 4.0?