找到我的可执行文件所在的文件夹的首选方法是什么?

时间:2017-09-27 23:12:45

标签: c# .net

我继承了一个.Net桌面应用,该应用有一个名为Data的文件夹,与可执行文件位于同一个文件夹中。目前,应用程序只会打开"Data",但如果当前目录不是包含可执行文件的目录,则会中断。我找到了两种获取可执行文件夹的方法:Assembly.GetExecutingAssembly().LocationAppDomain.CurrentDomain.BaseDirectory。后者更容易使用,因为我可以将"Data"附加到字符串。 AppDomain.CurrentDomain.BaseDirectory总是会返回可执行文件的目录,还是会出现这样的情况?

3 个答案:

答案 0 :(得分:3)

简短回答

99%的情况都应该完全正常。

<强>解释

当前正在执行的程序集目录是获取当前可执行文件位置的可靠方法。使用System.IO,您只需从路径中删除文件名:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

如果Data文件夹作为您编译的dll文件的一部分提供,则可能需要使用typeof(SomeClassInMyDll).Assembly.Location而不是正在执行的程序集。这是为了允许DLL的用户具有不常见的逻辑,例如根据其路径加载程序集,该路径可能与当前正在执行的程序集不同。

AppDomain.BaseDirectory属性是当前运行的代码在需要加载依赖项时查找DLL文件的位置。这通常与当前正在执行的程序集的路径位置相同,但是,如果正在调用您的代码的人将DLL加载到单独的AppDomain中,再次从文件名中明确加载它,BaseDirectory可能会与包含您的DLL或可执行文件的文件夹不同。

举一个不常见场景的例子,让我们说有一个可执行文件C:\foo\bar.exe,它可以从不同的路径动态加载DLL。这可以通过调用方法Assembly.LoadFrom("C:\MyFolder\MyDll.dll")来完成。在这种情况下,将返回以下内容:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) = C:\foo\
AppDomain.BaseDirectory = C:\foo\
Path.GetDirectoryName(typeof(SomeClassInMyDll).Assembly.Location) = C:\MyFolder\

答案 1 :(得分:1)

也许这个?

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)

答案 2 :(得分:-1)

没有任何首选方式,但最广泛使用的方式是这样。

System.Reflection.Assembly.GetEntryAssembly().Location;