Shahin
Shahin

Reputation: 12861

Find the location of my application's executable in WPF (C# or vb.net)?

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

Answers (9)

dexiang
dexiang

Reputation: 1413

this is useful for you: Application.ExecutablePath equals to:

Process.GetCurrentProcess().MainModule.FileName;

Upvotes: 22

ohmcodes
ohmcodes

Reputation: 79

try this AppContext.BaseDirectory

Upvotes: 0

Salih Kavaf
Salih Kavaf

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

mahdi b
mahdi b

Reputation: 35

Environment.CurrentDirectory returns parent directory of exe file

Upvotes: 1

marsh-wiggle
marsh-wiggle

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

George Birbilis
George Birbilis

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

scrat789
scrat789

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

Konrad Rudolph
Konrad Rudolph

Reputation: 546073

Several alternatives:

Directory.GetParent(Assembly.GetExecutingAssembly().Location)

System.AppDomain.CurrentDomain.BaseDirectory

Only in VB:

My.Application.Info.DirectoryPath

Upvotes: 41

Blorgbeard
Blorgbeard

Reputation: 103535

System.Reflection.Assembly.GetExecutingAssembly().Location should work.

Upvotes: 104

Related Questions