使用C#获取可执行文件的绝对路径?


78

看一下这个伪代码:

string exe_path = system.get_exe_path()
print "This executable is located in " + exe_path

如果我构建上述程序并将可执行文件放在中C:/meow/This executable is located in C:/meow/则无论当前工作目录如何,每次运行时它都会打印出。

我怎样才能轻松地完成此操作C#



Answers:


106

MSDN上有一篇文章说要使用System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase;如果您需要目录,请使用System.IO.Path.GetDirectoryName该结果。

或者,简称Application.ExecutablePath为“获取启动应用程序的可执行文件的路径,包括可执行文件的名称”,因此这可能意味着它的可靠性稍差,具体取决于启动应用程序的方式。


29
System.Reflection.Assembly.GetExecutingAssembly()仅在从那里调用EXE程序集的情况下才会获得。GetEntryAssembly()将获取正确的程序集。
GraemeF,2009年

6
如果您创建Windows服务,这尤其重要,因为该服务是从C:\ Windows \ System32启动的,因此您将拥有该工作目录。我将改用GraemeF的方法。
kevindaub

54
上面提到的方法将当前路径作为URI返回(即“ file:// c:\\ data”)。起作用的是: System.Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location ) );
arikfr'2

18
它实际上是“ System.IO.Path”。因此具有正确名称空间的标准名称应为:System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()。Location)
Victor Chelaru 2013年

9
Noelicus:根据答案和评论,几乎总是可以正常运行的安全,准确的方法是:System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly()。Location)
Graham Laight

55
AppDomain.CurrentDomain.BaseDirectory

9
这是最好,最简单的答案。无论当前目录如何,此方法都可在linux / mono和Windows上使用。
raider33 '16

12
using System.Reflection;

string myExeDir = new FileInfo(Assembly.GetEntryAssembly().Location).Directory.ToString();

1
不错,尽管可以简化为System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),但速度也更快。
mklement0


4
var dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

我跳到了评分最高的答案,发现自己没有达到我的期望。我必须阅读评论才能找到所需的内容。

因此,我将发表评论中列出的答案,以使其应有的曝光度。


1
不错,虽然应该,但是.GetEntryAssembly()不能.GetExecutingAssembly()
mklement0

2

假设我在控制台应用程序中有.config文件,现在变得如下图所示。

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\YourFolderName\\log4net.config";

2
不保证CurrentDirectory是应用程序正在其中执行的目录。

3
请使用Path.Combine。这样的手动组合路径中有很多代码无法在Mono中正常工作。
2015年

1

在我这边,我使用了表单应用程序:

String Directory = System.Windows.Forms.Application.StartupPath;

它采用了应用程序的启动路径。

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.