我有一个依赖于某些外部文件的dll。 我有相对路径(相对于dll位置)到这些文件。
我需要能够从DLL加载/读取这些文件。
找到我正在使用的文件的绝对路径:
System.IO.Path.GetFullPath(filePath);
它似乎正在工作,但我发现这实际上是返回了一个相对于当前目录的路径'。我发现当前目录在dll位置的某些位置发生了变化(甚至可能永远不会是dll路径)。
从DLL中运行的代码获取文件相对于DLL的绝对路径的最简单方法是什么?
我打算使用以下内容,但发现它返回已加载DLL的EXE的路径,而不是DLL路径:
AppDomain.CurrentDomain.BaseDirectory
答案 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);