从 Windows 开始菜单打开 WPF 应用程序时崩溃

Posted

技术标签:

【中文标题】从 Windows 开始菜单打开 WPF 应用程序时崩溃【英文标题】:WPF application crashes when it's opened from windows start menu 【发布时间】:2021-07-06 13:07:33 【问题描述】:

当尝试通过窗口开始菜单搜索其名称来打开在 .Net Core 3.1 中开发的 WPF 应用程序时,应用程序打开,它显示主窗口,但在几秒钟。但是,如果我以管理员身份打开它(在搜索其名称后右键单击开始菜单中的图标),应用程序会打开而不关闭,但它不会显示它应该显示的信息,只显示内置数据。

此应用程序数据/信息是从位于可执行位置子文件夹中的 XML 文件中读取的。在代码中,我通过相对路径访问这些文件:

internal const string PERSISTENT_FOLDER = @".\data\";
internal const string PERSISTENT_DATA_FILE = "data.xml";
internal const string PERSISTENT_DATA_FILE_PATH = PERSISTENT_FOLDER + PERSISTENT_DATA_FILE;

我也使用 serilog 来记录消息,但在上述两种情况下,日志文件中都没有写入任何内容。我将日志文件路径引用为相对路径:

private static string LogFile  get; set;  = @".\Logs\Log.log";

当我直接使用可执行文件或通过在桌面上创建的快捷方式打开应用程序时,应用程序运行良好。读取和写入数据以及在文件中注册日志。

如Microsoft documentation 中所述,应用程序作为“独立”发布

我不知道是什么真正导致了这种行为。

【问题讨论】:

您似乎假设当前目录设置为特定目录。通常情况并非如此。 【参考方案1】:

现在发生的是您从“工作目录”(Environment.CurrentDirectory) 中读取文件。当您从“开始”菜单运行应用时,工作目录将与您的应用位置不匹配。

而是直接检索您应用的位置,并在您需要访问任何此类文件时使用它:

var appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var fullPath = Path.Combine(appDir, @"Logs\Log.log"); // etc

这里的appDir 将是您的*.exe 文件所在目录的完整路径。

【讨论】:

谢谢,这就是解决方案。我只是使用这种方法更新代码中的所有相对路径引用。

以上是关于从 Windows 开始菜单打开 WPF 应用程序时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WPF 应用程序中打开 Windows 资源管理器到某个目录?

Windows Subsystem For Linux

win10系统的管理工具在哪儿,怎样找到并打开

如何从 NSIS 安装程序“刷新”Windows 7 开始菜单?

如何在WPF中单击菜单项时在父窗口下打开子窗口?

需要正确安装 Microsoft.Windows.ShellExperienceHost 和 "Microsoft.Windows.Cortana" 应用程序。