Ответ 1
System.Reflection.Assembly.GetExecutingAssembly().Location
должен работать.
Как найти расположение исполняемого файла приложения в WPF (С# или VB.Net)?
Я использовал этот код с окнами:
Application.ExecutablePath.ToString();
Но с WPF я получил эту ошибку из Visual Studio:
System.Window.Application не содержит определения для ExecutablePath.
System.Reflection.Assembly.GetExecutingAssembly().Location
должен работать.
Несколько альтернатив:
Directory.GetParent(Assembly.GetExecutingAssembly().Location)
System.AppDomain.CurrentDomain.BaseDirectory
Только в VB:
My.Application.Info.DirectoryPath
Выполняющая сборка может быть DLL, если код находится в библиотеке:
var executingAssembly = Assembly.GetExecutingAssembly(); //MyLibrary.dll
var callingAssembly = Assembly.GetCallingAssembly(); //MyLibrary.dll
var entryAssembly = Assembly.GetEntryAssembly(); //WpfApp.exe or MyLibrary.dll
Итак, лучший способ найти (С#):
var wpfAssembly = (AppDomain.CurrentDomain
.GetAssemblies()
.Where(item => item.EntryPoint != null)
.Select(item =>
new {item, applicationType = item.GetType(item.GetName().Name + ".App", false)})
.Where(a => a.applicationType != null && typeof(System.Windows.Application)
.IsAssignableFrom(a.applicationType))
.Select(a => a.item))
.FirstOrDefault();
Итак, в вашем случае вы можете найти местоположение сборки:
var location = wpfAssembly.Location;
это полезно для вас: Application.ExecutablePath равно:
Process.GetCurrentProcess().MainModule.FileName;
В соответствии с другими ответами, вот пример, который показывает, как удалить исполняемое имя из пути и объединить результат с некоторой вложенной папкой и именем файла:
в моей обновленной версии Hotspotizer (http://github.com/birbilis/Hotspotizer), я только что добавил поддержку загрузки файла Gesture Collection при запуске, если найденный в Library\Default.hsjson, используя следующий код:
const string GESTURE_COLLECTION_LIBRARY_PATH = "Library"
const string DEFAULT_GESTURE_COLLECTION = "Default.hsjson"
//...
LoadGestureCollection(
Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
GESTURE_COLLECTION_LIBRARY_PATH,
DEFAULT_GESTURE_COLLECTION));