在 WPF(C# 或 vb.net)中查找我的应用程序可执行文件的位置?

问题描述 投票:0回答:9

如何在 WPF(C# 或 VB.Net)中找到应用程序可执行文件的位置?

我已将此代码与 Windows 窗体一起使用:

Application.ExecutablePath.ToString();

但是使用 WPF 我从 Visual Studio 收到此错误:

System.Window.Application 不包含 ExecutablePath 的定义。

c# wpf vb.net
9个回答
100
投票

System.Reflection.Assembly.GetExecutingAssembly().Location
应该可以工作。


39
投票

几种替代方案:

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

System.AppDomain.CurrentDomain.BaseDirectory

仅在 VB 中:

My.Application.Info.DirectoryPath

22
投票

这对你有用: Application.ExecutablePath 等于:

Process.GetCurrentProcess().MainModule.FileName;

12
投票

以下内容适用于最新版本的.NET Core:

System.Environment.ProcessPath

这将返回启动当前正在运行的进程的可执行文件的路径。


3
投票

如果代码位于库中,则执行的程序集可以是 DLL:

var executingAssembly = Assembly.GetExecutingAssembly(); //MyLibrary.dll
var callingAssembly = Assembly.GetCallingAssembly(); //MyLibrary.dll
var entryAssembly = Assembly.GetEntryAssembly(); //WpfApp.exe or MyLibrary.dll

所以我发现最好的方法是(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();

因此,在您的情况下,您可以找到装配位置:

var location = wpfAssembly.Location;

2
投票

我用的就是这个。即使在调试器中它也能工作。

using System.IO;
using System.Diagnostics;

public static string GetMyBinDirectory()
{
    return Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
}

它使用了一些强大的类,例如 ProcessProcessModule


2
投票

Environment.CurrentDirectory
返回exe文件的父目录


0
投票

根据其他答案,这里有一个示例,展示了如何从路径中删除可执行文件名称并将结果与某些子文件夹和文件名组合:

在 Hotspotizer 的更新版本 (http://github.com/birbilis/Hotspotizer) 中,我刚刚添加了对在启动时加载手势集合文件的支持(如果在 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));

0
投票

尝试这个AppContext.BaseDirectory

© www.soinside.com 2019 - 2024. All rights reserved.