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

Get Absolute Path Relative to DLL location

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

我需要能够从 DLL load/read 那些文件。

找到我使用的文件的绝对路径:

System.IO.Path.GetFullPath(filePath);

它似乎工作正常,但我发现这实际上返回了一个相对于 'current directory' 的路径。我发现当前目录在某些时候从 dll 位置发生变化(甚至可能永远不是 dll 路径)。

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

本来打算用下面的,结果发现是returns加载了DLL的EXE路径,不是DLL路径:

AppDomain.CurrentDomain.BaseDirectory

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);