Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';查找可执行文件所在文件夹的首选方法是什么?_C#_.net - Fatal编程技术网

C# 什么';查找可执行文件所在文件夹的首选方法是什么?

C# 什么';查找可执行文件所在文件夹的首选方法是什么?,c#,.net,C#,.net,我继承了一个.Net桌面应用程序,它有一个名为Data的文件夹,该文件夹与可执行文件位于同一文件夹中。目前,应用程序只打开“Data”,但如果当前目录不是包含可执行文件的目录,则会中断。我找到了两种获取可执行文件文件夹的方法:Assembly.GetExecutingAssembly().Location和AppDomain.CurrentDomain.BaseDirectory。后者更易于使用,因为我可以将数据“附加到字符串中。AppDomain.CurrentDomain.BaseDirec

我继承了一个.Net桌面应用程序,它有一个名为
Data
的文件夹,该文件夹与可执行文件位于同一文件夹中。目前,应用程序只打开
“Data”
,但如果当前目录不是包含可执行文件的目录,则会中断。我找到了两种获取可执行文件文件夹的方法:
Assembly.GetExecutingAssembly().Location
AppDomain.CurrentDomain.BaseDirectory
。后者更易于使用,因为我可以将
数据“
附加到字符串中。
AppDomain.CurrentDomain.BaseDirectory
是否会始终返回可执行文件的目录,或者在某些情况下它可能不会返回

简短回答

在99%的情况下,两者都应该是完美的

解释

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

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

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

举一个不常见的例子,假设有一个可执行文件
C:\foo\bar.exe
,它从不同的路径动态加载DLL。这可以通过调用方法来完成。在这种情况下,将返回以下内容:

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

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

System.Reflection.Assembly.GetEntryAssembly().Location;
也许是这个

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

使用最广泛的是谁?你从哪里得到这些数据的?@CamiloTerevinto我不应该说“使用最广泛”,因为我知道人们会把它当作全球性的东西。我想我应该说这是最受欢迎的方式。