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

8

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

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

为了找到文件的绝对路径,我使用的方法是:

System.IO.Path.GetFullPath(filePath);

看起来这个方法是有效的,但我发现它实际上返回的是相对于“当前目录”的路径。我发现当前目录在某些时候会从dll位置改变(甚至可能永远不会是dll路径)。

如何以最简单的方式从运行在DLL中的代码获取文件相对于DLL的绝对路径?

我原本想使用下面的方法,但是发现它返回的是加载了DLL的EXE的路径,而不是DLL路径:

AppDomain.CurrentDomain.BaseDirectory

2
我认为你可以从代码库中获取文件名:Assembly.GetExecutingAssembly().CodeBase(如果当然在dll的函数内部调用)。 - John
是的,这对我有用。至少它找到了DLL的完整路径(字符串前面加上file:///)。将其输入作为答案,我会将其标记为正确。 - George Hernando
请注意,GetFullPath 函数是基于当前目录计算绝对路径的,当前目录可能与 EXE 文件的位置相同也可能不同,并且在应用程序运行期间也可能会更改。 - Alexei Levenkov
这个问题可能是类似于http://stackoverflow.com/questions/22661912/wpf-load-image-from-folder的重复问题... DLL通常在部署过程中不会带来额外的文件 - 因此最好实际上将路径相对于应用程序。 - Alexei Levenkov
1
在我的情况下,这个DLL是另一个应用程序的插件。 - George Hernando
2个回答

9

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"

太好了,谢谢。我最终使用了类似于你提出的方案。 - George Hernando

1
为了获取dll代码库的完整路径,您可以使用以下代码:
string codeBase = Assembly.GetExecutingAssembly().CodeBase;

你可以使用uriBuilder进一步清理此路径:
UriBuilder uri = new UriBuilder(codeBase);
string cleanFullPath = Uri.UnescapeDataString(uri.Path);

问题是“从在DLL中运行的代码相对于DLL文件获取文件的绝对路径最简单的方法是什么?”,因此我不确定这是否正是所请求的内容。可能需要从George那里进行一些澄清。 - Ben Randall
感谢您的帮助。 - George Hernando

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接