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

时间:2015-01-05 18:38:51

标签: c# dll path

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

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

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

System.IO.Path.GetFullPath(filePath);

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

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

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

AppDomain.CurrentDomain.BaseDirectory

2 个答案:

答案 0 :(得分:2)

除非指定绝对路径,否则

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"

答案 1 :(得分:1)

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

string codeBase = Assembly.GetExecutingAssembly().CodeBase;

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

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