执行装配位置未知

时间:2016-11-08 01:52:16

标签: c# .net assemblies taskscheduler

TL; DR

为什么

System.Reflection.Assembly.GetExecutingAssembly().Location 

返回"<Unknown>"

整个故事: 当我手动运行控制台应用程序时,一切顺利。当我设置任务计划程序来运行我的应用程序时,存在一个问题:我的应用程序无法找到一些相关文件。 这些文件写在.config文件中,如下所示: <add key="SomeFile" value="SomeFolder\SomeFile.xml"/>,我只需要相对的角色。

当我手动运行我的应用时,&#39;当前文件夹&#39; =&#39;应用程序文件夹&#39;,但当我使用任务计划程序运行时,&#39;当前文件夹&#39; = C:\Windows\system32,因为使用任务计划程序,我的应用程序在位于system32的taskeng.exe下运行。

所以为了找到汇编路径,我想使用这段代码:

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

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

但它没有用。

1 个答案:

答案 0 :(得分:0)

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

我在以下情况下才收到此错误:

  1. 该程序集构建为具有
  2. 优化的发布
  3. 该程序在Visual Studio外部运行,然后该过程附加到
  4. 命令Assembly.GetExecutingAssembly().Location通过立即窗口执行。
  5. 可以使用以下代码复制它。循环中的睡眠只是为了给我时间来附加调试器。

        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.

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