C# 什么';查找可执行文件所在文件夹的首选方法是什么?
我继承了一个.Net桌面应用程序,它有一个名为C# 什么';查找可执行文件所在文件夹的首选方法是什么?,c#,.net,C#,.net,我继承了一个.Net桌面应用程序,它有一个名为Data的文件夹,该文件夹与可执行文件位于同一文件夹中。目前,应用程序只打开“Data”,但如果当前目录不是包含可执行文件的目录,则会中断。我找到了两种获取可执行文件文件夹的方法:Assembly.GetExecutingAssembly().Location和AppDomain.CurrentDomain.BaseDirectory。后者更易于使用,因为我可以将数据“附加到字符串中。AppDomain.CurrentDomain.BaseDirec
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我不应该说“使用最广泛”,因为我知道人们会把它当作全球性的东西。我想我应该说这是最受欢迎的方式。