2016-01-09 3 views
1

Мне нужно получить полный путь (вплоть до каталога) исполняемого файла приложения, сделанного с помощью mkbundle --static. Это приложение CLI, которое я тестирую на OSX, предположим, что исполняемый файл находится в /usr/local/bin/.Получить путь к пакету в приложении Mono C# CLI

Вопросы, может быть дополнительно сложным (но я не знаю), так как я хочу, чтобы запустить утилиту из любой директории, поэтому я добавляю выше путь к $PATH переменной среды (в данном случае, это уже там).

Теперь предположим, что приложение запускается при ~/dir1/dir2/, и предположим, что оно печатает Application.StartupPath. Это дает путь ~/dir1/dir2/. Напротив, я хочу всегда получить каталог реального, из которого запускается приложение, то есть /usr/local/bin/.

Есть ли способ достичь этого (предпочтительно, независимо от платформы)?

Я использую Xamarin Studio с Mono/.NET 4.5 и C# 6.0.

ОБНОВЛЕНИЕ: Получение typeof(Program).Assembly.Location также не очень помогает.

Я имею в виду, что он работает хорошо, когда я запускаю обычный исполняемый файл приложения (созданный во время процесса сборки).

Однако, если я запустил комплект, составленный с помощью mkbundle --static, Location просто дает исполняемое имя App.exe без какого-либо предшествующего пути.

Возможно, он отображает только относительный путь внутри комплекта. Есть ли способ я могу получить путь к самой пачке ..

ответ

1

С типом, определенным в сборке, которая является частью вашего приложения вы можете найти свое местоположение, выполнив:

string location = typeof(Foo).Assembly.Location; 

Это дает вы полный путь к .dll или .exe, в зависимости от того, где определен тип Foo. Затем вы можете использовать Path.GetDirectoryName, если вам нужен только каталог.

string directory = System.IO.Path.GetDirectoryName(location); 

Вышеупомянутый должен работать с Mono, а также на Windows.

+0

Благодаря Matt. Он работает, если я запускаю 'mono app.exe', но не тогда, когда я запускаю пакет, созданный с помощью' mkbundle -static'. В этом случае он просто отображает 'app.exe', возможно, это путь относительно пакета? .. Все еще не могу понять, как получить путь к набору, или если это вообще возможно. – wh1t3cat1k

+0

Я изменил вопрос, чтобы отразить новое понимание проблемы. Знаете ли вы что-нибудь, что может быть полезно в моей ситуации? – wh1t3cat1k

+0

Извините, не знаю. Я подозреваю, что вам придется использовать [native api] (http://stackoverflow.com/questions/1023306/finding-current-executables-path-without-proc-self-exe), чтобы найти путь к текущему исполняемому файлу. –

2

Единственное, что я нашел надежный (вероятно, не самый быстрый способ, хотя) через Process:

Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) 
Смежные вопросы