Я знаю, что это старо, но предоставленные решения не очень удовлетворяют.
Вместо этого я использовал следующий класс:
using System.IO;
using System.Reflection;
public static class Program
{
public static string ExecutablePath
{
get;
private set;
}
static Program()
{
var assemblyPath = Assembly.GetEntryAssembly().Location;
var assemblyDirectory = Path.GetDirectoryName(assemblyPath);
if (assemblyDirectory.EndsWith(@"\Debug") || assemblyDirectory.EndsWith(@"\Release"))
{
string projectFile = Path.GetFileNameWithoutExtension(assemblyPath) + ".csproj";
var root = new DirectoryInfo(assemblyDirectory);
while (root.Parent != null)
{
if (File.Exists(Path.Combine(root.FullName, projectFile)))
break;
root = root.Parent;
if (root.Parent == null) // we could not find it (should not happen)
ExecutablePath = assemblyDirectory;
}
ExecutablePath = root.FullName;
}
else
{
ExecutablePath = assemblyDirectory;
}
}
}
Тогда вы можете просто использовать Program.ExecutablePath
. Если у вас уже есть класс с именем Program
, вы можете просто расширить его с помощью этих свойств и методов.
При запуске из Visual Studio он даст вам путь к проекту, в котором находится файл csproj. Это путь к исполняемому файлу без содержимого «bin \ * \ Debug» или «bin \ * \ Release».
Если он не запущен из Visual Studio, он укажет путь к исполняемому файлу.
Решение не зависит от настроек отладки, других подключенных отладчиков или конфигураций сборки. Единственное, что важно, чтобы ваши конфигурации назывались «Release» и «Debug».
Примечание: Как упомянул в комментариях Трой Джиззи, это решение работает, только если вы запускаете исполняемый файл из другого каталога, а не из выходного каталога. Для моего варианта использования (смоделируйте структуру каталогов развертывания с корневым каталогом проекта), это подходящее решение. Обычно я копирую свой исполняемый файл позже в каталог развертывания и ожидаю того же поведения, как если бы я запускал свою программу из Visual Studio. В моем случае содержимое и другие зависимости расположены относительно каталога проекта.