К сожалению, класс 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 файле все пути должны быть относительными и все будет отлично.