Ответ 1
Я только посмотрел исходный код Application.ExecutablePath
, и реализация по существу такова: *
Assembly asm = Assembly.GetEntryAssembly();
string cb = asm.CodeBase;
var codeBase = new Uri(cb);
if (codeBase.IsFile)
return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment);
else
return codeBase.ToString();
Свойство Assembly.CodeBase
вернет местоположение как URI. Что-то вроде:
file:///C:/myfolder/myfile.exe
#
- это маркер фрагмента в URI; он отмечает начало фрагмента. По-видимому, класс Uri
изменяет данный uri, когда он анализируется и снова преобразуется обратно в строку.
Так как Assembly.Location
содержит "нормальный" путь к файлу, я думаю, ваша лучшая альтернатива:
string executablePath = Assembly().GetEntryAssembly().Location;
*) Реализация более сложная, чем эта, потому что она также касается ситуаций, когда есть несколько областей приложения и другие особые ситуации. Я упростил код для наиболее распространенной ситуации.