获取当前程序集的路径

Den*_*ail 43 .net vb.net visual-studio

我如何获得当前组件的路径?我需要从某些路径获取相对于当前程序集(.dll)位置的数据.

我以为有人告诉我使用反射命名空间,但我找不到任何东西.

Ree*_*sey 77

您可以使用:

string path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath;
Run Code Online (Sandbox Code Playgroud)

注释中的一些建议是通过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 + "]");
Run Code Online (Sandbox Code Playgroud)

如果我们正在运行输出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]

  • @Marijn这就是问题 - 它是影子复制之后的位置.通常,您需要在加载之前获取实际文件的位置,上面给出了... (10认同)
  • 我建议调用Path.GetFullPath将正斜杠转换为反斜杠.使用正斜杠时,您可以从Assembly.LoadFile(例如不等于的类型)中获得奇怪的行为. (7认同)
  • 调用`System.Uri.UnescapeDataString`将百分比编码的文件路径转回普通文件路径.Uri构造函数将空格编码为"%20",这将通过.NET方法逐字理解,这些方法期望传统的文件路径而不是URI. (7认同)
  • @pst:根据环境的不同,位置可能不正确,因为卷影复制可以在执行之前"移动"程序集. (4认同)
  • 使用它而不是`.Location`的优点/目的是什么?(我怀疑必须有一个理由,但它让我望而却步.) (3认同)

Sam*_*Axe 6

只是为了说清楚:

Assembly.GetExecutingAssembly().Location
Run Code Online (Sandbox Code Playgroud)