Использование resx ресурсов в Visual Studio .NET

Ненавидите resx файлы? Надоело в каждый новый проект включать класс ResourceHelper, не забывая при этом подправить namespace для ресурсов? Воспользуйтесь генератором для Visual Studio! Вас бесит, когда студия в resx файл вместо ссылки включает саму иконку? Ничего не поделаешь, придется поработать руками… Делается это при помощи класса ResXFileRef.

К сожалению, класс ResXResourceReader игнорирует имя resx файла и работает с его содержимым как с безликим потоком. Кроме того, механизм TypeConverter, с помощью которого он поднимает обработчик для конкретного типа ресурса, не позволяет получить никакой дополнительной информации кроме той, что есть непосредственно в resx файле.

Все это я говорю к тому, чтобы стало понятно, почему класс ResXFileRef работает только с абсолютными путями… Хотя, если быть точным, функция CreateFile может работать с относительными путями отсчитывая их от текущей директории для процесса. Проблема в том, что предсказать какая директория окажется текущей в каждом конкретном случае запуска Visual Studio невозможно…

Таким образом, у нас есть несколько путей решения проблемы:1.

Использовать абсолютные пути - не подходит, т.к. код у всех разработчиков лежит в разных местах 2.

Использовать переменные окружения, для указания корня проекта - не работает в случае нескольких версий продукта 3.

Каким-то образом выставлять в процессе компиляции (Pre-Build Step) текущую директорию для процесса devenv.exe

Именно по третьему пути мы и пошли, в результате чего на свет появилась маленькая утилита SetCurDir:

Process Current Directory Fixer (c) 2004 Digital Design


Usage: SetCurDir.exe
<new_current_dir> --- new current directory
[/pid <process_id>] --- process identifier
[/pname <process_name>] --- process name
[/?:help] --- show (this) usage information

Использовать ее очень просто, достаточно в свойства проекта в качестве Pre-build step указать команду:


SetCurDir /pname devenv.exe $(ProjectDir)

Ее использование приведет к тому, что текущая директория для процесса(-ов) devenv.exe будет указывать на корень проекта. В resx файле все пути должны быть относительными и все будет отлично.