Ответ 1
Одно правильное и кросс-платформенное решение будет
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
Обратите внимание, что как Environment.CurrentDirectory
, так и Assembly.GetExecutingAssembly().Location
(точнее, их каталог) семантически неправильны, хотя они часто - но не всегда - тот же каталог:
- Текущий каталог является "рабочим каталогом" и может быть изменен в любой момент времени, например команда "cd" в оболочке.
- Выполняющая сборка - это сборка, которая содержит код, который в настоящее время работает, и может быть или не быть в том же каталоге, что и фактическое приложение. Например, если ваше приложение "A.exe", которое имеет зависимость "B.dll", а некоторый код в B.dll вызывает
Assembly.GetExecutingAssembly()
, это приведет к "/path/to/B.dll".