从WPF应用程序获取应用程序的目录


170

我找到了带有AppDomain的Windows窗体的解决方案,但是WPF Application对象的等效项是什么?

Answers:


329

一种方法:

System.AppDomain.CurrentDomain.BaseDirectory

另一种方法是:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

嗯谢谢 一定以某种方式忽略了AppDomain。我一直在寻找它,实际上……
乔伊

3
@海伦:从投票结果来看,这显然是一个很好的答案。但是,答案有两种获取应用程序目录的方法。他们俩会平等地工作吗?
Christoffer Lette 2011年

21
我会使用第一种选择。它看起来更简单,没有方法调用,并且对读取时该行实际执行的操作产生了更少的疑问。
Filip

3
我在WCF服务,WPF应用程序和类库项目中使用了第一种方法,并且在所有情况下都可以正常工作。
Apostrofix

1
对于NetCore和NetStandard,我会推荐第二个,因为AppDomain是在2.0中添加的,并且无法始终按预期设置
cdie

28

这是另一个:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
docs所述,这是影印后获得的位置。我实际上不确定接受的答案中的建议是否受到卷影复制的影响。
Christoffer Lette 2011年

2
这给了我正在调用的DLL的子目录,而不是主程序目录。
strattonn

7

您还可以使用命令行参数的第一个参数:

String exePath = System.Environment.GetCommandLineArgs()[0]


1
但是,请注意,“恶意”应用程序可以修改其命令行参数。
Daniel Rose

@Daniel:为什么要自己做呢?还是您是指其他应用程序?
Merlyn Morgan-Graham

1
@梅林:请参阅blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx我要引用:这是“对流程启动代码的方便初始化的参数”。因此,您可以有意或无意地修改该内存位置。
丹尼尔·罗斯

1
@丹尼尔:谁能?另一个过程,还是相同的过程?如果您用脚开枪射击,应该很容易追踪。我称其为更少的邪恶,更多的是愚蠢的:)如果另一个进程可以做到这一点,那就更有趣了。编辑:在该文章中,我没有看到任何有关修改正在运行的程序的命令行的信息-只是启动过程将其传入(不确定启动过程更改命令行是不希望的),并且您可以查询它通过WMI。
Merlyn Morgan-Graham

@ MerlynMorgan-Graham恶意应用程序可以修改内存地址,并迫使您的应用程序运行其恶意应用程序中的另一个。这很邪恶,因为假设他们的应用程序是键盘记录器,并且他们希望您在打开另一个应用程序后立即激活它。因此,他们将在他们的代码中捕获您的应用程序名称,在后台运行其键盘记录程序,然后运行您的应用程序。用户将一无所知。本文确实对此进行了解释,但并未告诉您如何执行此操作。也许这就是您想要的?
pqsk 2014年

6

我只是简单地使用了string baseDir = Environment.CurrentDirectory;它的工作。

祝好运

编辑:

我曾经删除这种类型的错误,但我更喜欢编辑它,因为我认为此答案的不足之处可以帮助人们了解错误的方式。:)我知道上面的解决方案没有用,我将其更改为string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; 其他获得它的方法是:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

祝好运


3
那是当前的工作目录。它可能与应用程序目录一致,但是它们是独立的概念(最重要的是,可以更改工作目录,例如,如果打开了公共文件对话框)。
乔伊(Joey)

1
@joey你是对的。我将其更改为:string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; 谢谢。
QMaster 2012年

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

试试这个!


3

试试这个。别忘了using System.Reflection

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

我尝试了这个:

    label1.Content = Directory.GetCurrentDirectory();

并获取目录。


这将获得当前的工作目录,该目录可以与进程目录不同。
Thraka 2014年

我想我必须评估Directory.GetCurrentDirectory(); 更多。谢谢@Thraka的纠正。
保罗

0

您也可以从System.Windows.Forms中自由使用Application.StartupPath,但是必须添加System.Windows.Forms程序集的引用!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.