Как найти путь к приложению в консольном приложении?
В Windows Forms я могу использовать, Application.StartupPath
чтобы найти текущий путь, но он не доступен в консольном приложении.
c#
.net
console
console-application
JSmyth
источник
источник
Ответы:
System.Reflection.Assembly.GetExecutingAssembly()
, 1Location
Добавьте к этому,
System.IO.Path.GetDirectoryName
если все, что вам нужно, это каталог.источник
GetExecutingAssembly
возвращает сборку, содержащую код, который в данный момент выполняется . Это не обязательно сборка консоли .exe . Это может быть сборка, которая была загружена из совершенно другого места. Вам придется использоватьGetEntryAssembly
! Также обратите внимание, чтоCodeBase
это не может быть установлено, когда сборка находится в GAC. Лучшая альтернативаAppDomain.CurrentDomain.BaseDirectory
.Вы можете использовать следующий код, чтобы получить текущий каталог приложения.
источник
BaseDirectory
может быть установлено во время выполнения? У него есть только добытчик.У вас есть два варианта поиска каталога приложения, который вы выберете, будет зависеть от вашей цели.
источник
var localDirectory = new Uri(directory).LocalPath;
Возможно, немного поздно, но это стоит упомянуть:
Или правильнее получить только путь к каталогу:
Редактировать:
Довольно много людей отметили, что
GetCommandLineArgs
не гарантируется возвращение имени программы. См . Первое слово в командной строке - это имя программы только по соглашению . В статье утверждается, что «Хотя очень немногие программы для Windows используют эту причуду (я сам о себе не знаю)». Так что можно «подделать»GetCommandLineArgs
, но речь идет о консольном приложении. Консольные приложения обычно бывают быстрыми и грязными. Так что это вписывается в мою философию KISS.источник
Для всех, кто интересуется веб-приложениями asp.net. Вот мои результаты 3 разных методов
результат
приложение физически запускается из «C: \ inetpub \ SBSPortal_staging», поэтому первое решение определенно не подходит для веб-приложений.
источник
Ответ выше был на 90% от того, что мне было нужно, но вместо обычного пути я вернул Uri.
Как объясняется в сообщении на форумах MSDN, Как преобразовать путь URI в обычный путь к файлу? Я использовал следующее:
источник
File.CreateDirectory(path)
, это даст вам исключение, что он не разрешает пути URI ...#
символ). Идентификатор и все, что следует за ним, усекается из полученного пути.new Uri
иSystem.IO.Path.GetDirectoryName
? Это дает вам нормальную строку пути вместоUri
.Возможно, вы хотите сделать это:
источник
Вы можете использовать это вместо этого.
источник
Если вы ищете .NET Core совместимый способ, используйте
Это было представлено в .NET Framework 4.6 и .NET Core 1.0 (и .NET Standard 1.3). Смотрите: Свойство AppContext.BaseDirectory .
Согласно этой странице ,
источник
Process.GetCurrentProcess().MainModule.FileName
Для консольных приложений вы можете попробовать это:
Вывод (на моей локальной машине):
Или вы можете попробовать (в конце есть дополнительная обратная косая черта):
Вывод:
источник
BaseDirectory
Может быть установлено во время выполнения. Оно НЕ гарантированно будет правильным»Я использовал этот код и получил решение.
источник
Вы можете просто добавить в свой проект ссылки,
System.Windows.Forms
а затем использоватьSystem.Windows.Forms.Application.StartupPath
как обычно.Таким образом, не нужно более сложных методов или использования отражения.
источник
Следующая строка даст вам путь к приложению:
Вышеупомянутое решение работает должным образом в следующих ситуациях:
mkbundle
связками Моно (другие методы не работают)источник
Я использую это, если предполагается, что exe-файл вызывается двойным щелчком
источник
я использовал
когда я хочу найти путь относительно папки приложений. Это работает как для ASP.Net, так и для приложений winform. Также не требуется никаких ссылок на сборки System.Web.
источник
Я имею в виду, почему не метод ap / invoke?
Вы бы использовали его так же, как Application.StartupPath:
источник
Assembly.GetEntryAssembly().Location
илиAssembly.GetExecutingAssembly().Location
Использовать в сочетании с
System.IO.Path.GetDirectoryName()
чтобы получить только каталог.Пути от
GetEntryAssembly()
иGetExecutingAssembly()
могут отличаться, хотя в большинстве случаев каталог будет одинаковым.При этом
GetEntryAssembly()
вы должны знать, что это может вернуться,null
если модуль ввода неуправляемый (т.е. исполняемый файл C ++ или VB6). В этих случаях можно использоватьGetModuleFileName
из Win32 API:источник
в VB.net
у меня работает (Тип приложения: Библиотека классов). Не уверен насчет C # ... Возвращает путь без имени файла в виде строки
источник
Решит проблему, ссылаясь на сторонние справочные файлы с установочными пакетами.
источник
Ни один из этих методов не работает в особых случаях, таких как использование символической ссылки на исполняемый файл, они будут возвращать местоположение ссылки, а не фактический исполняемый файл.
Поэтому можно использовать QueryFullProcessImageName, чтобы обойти это:
источник
Попробуйте эту простую строку кода:
источник
Другое решение использует относительные пути, указывающие на текущий путь:
источник
Я не видел, чтобы кто-нибудь преобразовал LocalPath, предоставленный отражением .Net Core, в пригодный для использования путь System.IO, так что вот моя версия.
Это вернет полный путь в формате «C: \ xxx \ xxx» туда, где находится ваш код.
источник
Есть много способов получить путь к исполняемому файлу, который мы должны использовать, это зависит от наших потребностей. Вот ссылка, которая обсуждает различные методы.
Различные способы получить путь к исполняемому приложению
источник
Вот надежное решение, которое работает с 32-битными и 64-битными приложениями.
Добавьте эти ссылки:
Добавьте этот метод в ваш проект:
Теперь используйте это так:
Обратите внимание, что если вы знаете идентификатор процесса, то этот метод вернет соответствующий ExecutePath.
Дополнительно для заинтересованных:
... даст вам массив всех запущенных в данный момент процессов и ...
... даст вам текущий процесс, вместе с их информацией, например, Id и т. д., а также ограниченным контролем, например, Kill и т. д. *
источник
Вы можете создать имя папки как Ресурсы в проекте, используя Solution Explorer, затем вы можете вставить файл в Ресурсы.
источник