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