执行程序集位置未知

本文关键字:未知 位置 程序集 执行程序 执行 | 更新日期: 2023-09-27 18:17:03

TL;DR

为什么
System.Reflection.Assembly.GetExecutingAssembly().Location 

返回"<Unknown>" ?

整个故事:当我手动运行控制台应用程序时,一切都很顺利。当我设置任务调度程序来运行我的应用程序时,有一个问题:我的应用程序找不到一些依赖文件。这些文件像这样写在.config文件中:<add key="SomeFile" value="SomeFolder'SomeFile.xml"/>,我只需要相对路径。

当我手动运行我的应用程序时,'当前文件夹' = '应用程序文件夹',但当我使用任务调度程序运行时,'当前文件夹' = C:'Windows'system32,因为使用任务调度程序,我的应用程序在taskeng.exe下运行,位于system32。

所以要找到汇编路径,我想使用以下代码:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

从这个答案https://stackoverflow.com/a/16102640/6184866.

执行程序集位置未知

本机编译后,该程序集将不再存在于文件系统中。

拉当前目录的最新方法是:

AppContext.BaseDirectory

.net6

我在控制台应用程序中也遇到了同样的问题。

只有当

  1. 程序集在
  2. 上进行优化后作为发布版本构建。
  3. 程序在Visual Studio外部运行,然后进程附加到
  4. 命令Assembly.GetExecutingAssembly().Location通过即时窗口执行。

可以用下面的代码复制。循环中的sleep只是为了给我时间来附加调试器。

static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(10 - i);
        Thread.Sleep(1000);
    }
    Console.WriteLine(Assembly.GetExecutingAssembly().Location);
    Console.WriteLine(Directory.GetCurrentDirectory());
    Console.ReadLine();
}

中断此代码(当上述约束为真时)并从立即窗口执行命令Assembly.GetExecutingAssembly().Location返回<Unknown>。执行Directory.GetCurrentDirectory()返回Cannot evaluate expression because the code of the current method is optimized.

但是,这两个命令都执行并将期望的正确值打印到控制台。