Как перенести сборку, совместимую с .NET 3.5, со встроенными строковыми ресурсами на .NET 4.0? - PullRequest
0 голосов
/ 16 ноября 2011

Я конвертировал некоторые проекты на основе .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?

1 Ответ

0 голосов
/ 17 ноября 2011

Загадка решена.

.NET (до 4.0) сначала ищет файл .resource.Если файл не найден, он ищет в сборке запрошенный ресурс.

Начиная с .NET 4.0, если файл .resource не существует, среда запускает AppDomain.AssemblyResolveсобытие и передает имя файла ресурса вместо имени сборки. (Почему AssemblyResolve? - возможно, это ошибка.) Только .NET, если это событие не обрабатывается, .NET 4.0 ищет внутри сборки ресурс.

Как оказалось, в приложении был зарегистрирован обработчик AssemblyResolve.Обработчик был запрограммирован на поиск библиотек DLL и никогда не прерывался годами до дня обновления .NET 4.0, когда ему было предложено найти несуществующий файл ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...