获取相对于 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);
我有一个依赖于某些外部文件的 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);