获取当前程序集的路径

45

如何获取当前程序集的路径?我需要获取与当前程序集(.dll)位置相关的一些路径数据。

我曾经听说要使用反射命名空间,但是在那里我找不到任何东西。


2
Assembly.GetExecutingAssembly().Location - RichieHindle
4个回答

83

你可以使用:

string path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath;

一些评论中的建议是将其传递到 System.Uri.UnescapeDataString (来自 vvnurmi) 以确保处理任何百分号编码,并使用 Path.GetFullpath (来自 TrueWill) 确保路径采用标准 Windows 格式(而不是具有斜杠而不是反斜杠)。这是每个阶段获得的示例:

string s = Assembly.GetExecutingAssembly().CodeBase;
Console.WriteLine("CodeBase: [" + s + "]");
s = (new Uri(s)).AbsolutePath;
Console.WriteLine("AbsolutePath: [" + s + "]");
s = Uri.UnescapeDataString(s);
Console.WriteLine("Unescaped: [" + s + "]");
s = Path.GetFullPath(s);
Console.WriteLine("FullPath: [" + s + "]");

如果我们运行的是 C:\Temp\Temp App\bin\Debug\TempApp.EXE,则输出如下:

CodeBase: [file:///C:/Temp/Temp App/bin/Debug/TempApp.EXE]
AbsolutePath: [C:/Temp/Temp%20App/bin/Debug/TempApp.EXE]
Unescaped: [C:/Temp/Temp App/bin/Debug/TempApp.EXE]
FullPath: [C:\Temp\Temp App\bin\Debug\TempApp.EXE]

8
我建议调用Path.GetFullPath将正斜杠转换为反斜杠。在使用正斜杠时,Assembly.LoadFile可能会出现奇怪的行为(例如类型不相等)。 - TrueWill
3
相较于使用.Location,使用这个有什么优势/目的?(我猜想一定有原因,但是我不明白。) - user166390
4
根据环境的不同,位置可能是不正确的,因为阴影复制可以在执行之前“移动”程序集。 - Reed Copsey
10
@Marijn 这就是问题所在——这是在阴影复制之后的位置。通常,您希望在加载之前获取实际文件的位置,而上面的代码可以为您提供这个位置。 - Reed Copsey
8
使用System.Uri.UnescapeDataString方法将百分号编码的文件路径转换成普通文件路径。 Uri构造函数会将例如空格编码为“%20”,这将被.NET方法字面理解为传统文件路径而不是URI。 - vvnurmi
显示剩余4条评论

46

当从MSTest单元测试中调用时,它会提供mscorlib的位置,而不是您的程序集。 - Edward Brey

7

为了明确起见:

Assembly.GetExecutingAssembly().Location

3

I prefer

new System.Uri(Assembly.GetExecutingAssembly().EscapedCodeBase).LocalPath;

EscapedCodeBase涵盖了您的本地路径可能包含无效URI字符的情况(请参见https://dev59.com/9EfRa4cB1Zd3GeqP_LDB#21056435

LocalPath包括本地路径和UNC路径的完整路径,而AbsolutePath则修剪掉“\ \ server”


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