开发者

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

开发者 https://www.devze.com 2023-01-04 16:24 出处:网络
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:

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 wit开发者_JAVA技巧h WPF I received this error from Visual Studio:

System.Window.Application does not contain a definition for ExecutablePath.


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


Several alternatives:

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

System.AppDomain.CurrentDomain.BaseDirectory

Only in VB:

My.Application.Info.DirectoryPath


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

Process.GetCurrentProcess().MainModule.FileName;


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.


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;


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


Environment.CurrentDirectory returns parent directory of exe file


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));
0

精彩评论

暂无评论...
验证码 换一张
取 消