Когда программа запускается, вы должны предполагать, что объект не знает о исходном коде , который его сгенерировал. Код скомпилирован в сборку, и эта сборка загружается при запуске программы, поэтому «текущим» каталогом по умолчанию является местоположение исполняемой сборки.
Короче говоря, это не то, что вы можете сделать чисто. Лучше всего, если ваш код не опирается на концепцию каталогов, относящихся к исходному коду. Это может помочь вам в достижении ваших целей, если вы измените действие сборки для искомого файла, чтобы он был скопирован в выходной каталог. Затем относительный путь этого файла во время выполнения должен отражать относительный путь в папке вашего проекта.
Чтобы получить путь к исполняемой сборке («текущий» путь может быть изменен любым другим исполняемым кодом, поэтому лучше не полагаться на это), используйте этот код:
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase);