执行程序集位置未知
本文关键字:未知 位置 程序集 执行程序 执行 | 更新日期: 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
我在控制台应用程序中也遇到了同样的问题。
只有当
- 程序集在 上进行优化后作为发布版本构建。
- 程序在Visual Studio外部运行,然后进程附加到
- 命令
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.
但是,这两个命令都执行并将期望的正确值打印到控制台。