Reputation: 12861
How can I find the location of my application's executable in WPF (C# or VB.Net)?
I've used this code with Windows Forms:
Application.ExecutablePath.ToString();
But with WPF I received this error from Visual Studio:
System.Window.Application does not contain a definition for ExecutablePath.
Upvotes: 66
Views: 71937
Reputation: 1413
this is useful for you:
Application.ExecutablePath
equals to:
Process.GetCurrentProcess().MainModule.FileName;
Upvotes: 22
Reputation: 1145
The following is applicable in the recent versions of .NET Core:
System.Environment.ProcessPath
This returns the path of the executable that started the currently running process.
Upvotes: 18
Reputation: 2813
This is what I use. It works even in debugger.
using System.IO;
using System.Diagnostics;
public static string GetMyBinDirectory()
{
return Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
}
It uses some powerfull classes, like Process and ProcessModule
Upvotes: 3
Reputation: 2940
Based on others answers, here's an example that shows how to remove the executable name from the path and combine the result with some subfolder and filename:
at my updated version of Hotspotizer (http://github.com/birbilis/Hotspotizer), I've just added support for loading a Gesture Collection file at startup, if found at Library\Default.hsjson, by using the following code:
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));
Upvotes: 0
Reputation: 3009
The executing assembly can be a DLL if the code is located in a library:
var executingAssembly = Assembly.GetExecutingAssembly(); //MyLibrary.dll
var callingAssembly = Assembly.GetCallingAssembly(); //MyLibrary.dll
var entryAssembly = Assembly.GetEntryAssembly(); //WpfApp.exe or MyLibrary.dll
So the best way I found is (C#) :
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();
So in your case, you can find location of the assembly :
var location = wpfAssembly.Location;
Upvotes: 3
Reputation: 546073
Several alternatives:
Directory.GetParent(Assembly.GetExecutingAssembly().Location)
System.AppDomain.CurrentDomain.BaseDirectory
Only in VB:
My.Application.Info.DirectoryPath
Upvotes: 41
Reputation: 103535
System.Reflection.Assembly.GetExecutingAssembly().Location
should work.
Upvotes: 104