我有一个依赖于一些外部文件的 dll。我有这些文件的相对路径(相对于 dll 位置)。
我需要能够从 DLL 加载/读取这些文件。
要找到我正在使用的文件的绝对路径:
System.IO.Path.GetFullPath(filePath);
Run Code Online (Sandbox Code Playgroud)
它似乎有效,但我发现这实际上返回了一个相对于“当前目录”的路径。我发现当前目录在某个时候从 dll 位置发生了变化(甚至可能永远不会是 dll 路径)。
从 DLL 中运行的代码获取文件相对于 DLL 的绝对路径的最简单方法是什么?
我打算使用以下内容,但发现它返回加载了 DLL 的 EXE 的路径,而不是 DLL 路径:
AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
GetFullPath除非您指定绝对路径,否则始终假定相对于当前目录。您应该手动将您的程序集路径与您的相对路径组合起来。然后,您可以将结果标准化以获得干净的路径。
string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"..\SomeFolder\SomeRelativeFile.txt");
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly);
Run Code Online (Sandbox Code Playgroud)
例如。如果程序集位置是“C:\Test\MyAssembly.dll”,那么你会得到这个
assemblyPath = "C:\Test"
filePathRelativeToAssembly = "C:\Test\..\SomeFolder\SomeRelativeFile.txt"
normalizedPath = "C:\Test\SomeFolder\SomeRelativeFile.txt"
Run Code Online (Sandbox Code Playgroud)
此外,如果您传入绝对路径作为它的第二部分,Path.Combine它仍然会做正确的事情。
string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"C:\AbsoluteFile.txt");
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly);
Run Code Online (Sandbox Code Playgroud)
会给你
filePathRelativeToAssembly = "C:\AbsoluteFile.txt"
normalizedPath = "C:\AbsoluteFile.txt"
Run Code Online (Sandbox Code Playgroud)