获取相对于 DLL 位置的绝对路径

本文关键字:路径 位置 相对于 DLL 获取 | 更新日期: 2023-09-27 18:36:22

我有一个依赖于一些外部文件的dll。我有这些文件的相对路径(相对于 dll 位置)。

我需要能够从 DLL 加载/读取这些文件。

要查找我正在使用的文件的绝对路径,请执行以下操作:

System.IO.Path.GetFullPath(filePath);

它似乎正在工作,但我发现这实际上是返回相对于"当前目录"的路径。 我发现当前目录在某个时候从 dll 位置更改(甚至可能永远不会是 dll 路径)。

从 DLL 中

运行的代码中获取文件相对于 DLL 的绝对路径的最简单方法是什么?

我打算使用以下方法,但发现它返回已加载 DLL 的 EXE 的路径,而不是 DLL 路径:

AppDomain.CurrentDomain.BaseDirectory

获取相对于 DLL 位置的绝对路径

除非指定绝对路径,否则GetFullPath始终假定相对于当前目录。 您应该手动将程序集路径与相对路径组合在一起。 然后,您可以规范化结果以获得干净的路径。

string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"..'SomeFolder'SomeRelativeFile.txt");
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly);

例如。 如果程序集位置是"C:''Test''MyAssembly.dll",则得到这个

assemblyPath = "C:'Test"
filePathRelativeToAssembly = "C:'Test'..'SomeFolder'SomeRelativeFile.txt"
normalizedPath = "C:'Test'SomeFolder'SomeRelativeFile.txt"

此外,如果您在Path.Combine的第二部分以绝对路径传递,它仍然会执行正确的操作。

string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"C:'AbsoluteFile.txt");
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly);

会给你

filePathRelativeToAssembly = "C:'AbsoluteFile.txt"
normalizedPath = "C:'AbsoluteFile.txt"

若要获取 dll 代码库的完整路径,可以使用以下代码:

string codeBase = Assembly.GetExecutingAssembly().CodeBase;

您可以使用 uriBuilder 进一步清理此路径:

UriBuilder uri = new UriBuilder(codeBase);
string cleanFullPath = Uri.UnescapeDataString(uri.Path);