如果我使用“打开方式”,C# WPF 应用程序会静默崩溃

Posted

技术标签:

【中文标题】如果我使用“打开方式”,C# WPF 应用程序会静默崩溃【英文标题】:C# WPF App silently crashes if I use "open with" 【发布时间】:2020-11-17 01:32:40 【问题描述】:

我正在用 C# WPF 制作一个文本编辑器。将项目发布到文件夹后,我可以双击 .exe,它运行良好,并且可以使用我的打开 (CTRL+O) 功能加载文件。

我想使用 打开方式 > 选择另一个应用 > 更多应用 > 在这台电脑上查找另一个应用 (我还不担心文件关联 - 在开发过程中这很好)

这就是问题所在 - 无论我对我的代码做什么,当我使用这种方法打开它时,我都无法让我的应用程序做任何有用的事情。发生的情况是它会弹出一个随机大小的白色窗口,看起来很忙 - 2 秒后它会自行关闭。窗口的名字是“%PathOfTheFileIOpened% - KuroNote”,好像是自动的。

App.xaml

<Application x:Class="KuroNote.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:KuroNote"
             Startup="Application_Startup"
             ShutdownMode="OnMainWindowClose">
    <Application.Resources>
         
    </Application.Resources>
</Application>

App.xaml.cs

namespace KuroNote

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    
        private void Application_Startup(object sender, StartupEventArgs e)
        
            MessageBox.Show("test");
            foreach (string s in e.Args)
            
                MessageBox.Show(s);
            
        
    

如您所见,我删除了所有有用的代码来尝试让它做一些事情 - 我什至没有打开主窗口,我只是希望它输出它的命令行参数。当我使用“在这台 PC 上查找另一个应用程序”方法时,我什至没有看到“测试”消息框,就像上面写的那样。

从this screenshot of the project properties, 可以看出,启动对象也设置为应用程序。


我认为这可能与权限有关,但可执行文件和要打开的文件永远不会在受保护的管理员区域中。

我之前在调试时做过测试,检索在项目属性>调试选项卡>“应用程序参数:”中设置的命令行参数,并且这些都很好地返回。使用“在这台 PC 上查找另一个应用程序”方法打开似乎有些不同,它所做的不仅仅是使用带有文件路径的命令行参数启动应用程序。

我是否缺少 App.xaml 中启用“打开方式”功能的某种标志?


它是一个纯粹的离线应用程序,不是网络应用程序,我发布后得到的文件只是“KuroNote.deps.json”、“KuroNote.dll”、“KuroNote.exe”、“KuroNote.pdb”和“ KuroNote.runtimeconfig.json”,没有听起来像“ClickOnce”使用的“.application”文件。如果我在 Visual Studio 中搜索“ClickOnce”,它说我可以安装它,但听起来不像已经安装了。除非我需要禁用一些隐藏的“使用 ClickOnce”设置?

【问题讨论】:

尝试添加一个try/catch,调试它,看看是否抛出异常。 嗨@BrettWertz,不幸的是,这似乎没有任何改变。它甚至没有显示上面看到的“测试”消息框,这是启动方法中的第一行代码。 嘿@J...这是一个纯粹的离线应用程序,不是网络应用程序,我发布后得到的文件只是“KuroNote.deps.json”、“KuroNote.dll”、“KuroNote” .exe”、“KuroNote.pdb”和“KuroNote.runtimeconfig.json”,没有听起来像“ClickOnce”使用的“.application”文件。如果我在 Visual Studio 中搜索“ClickOnce”,它说我可以安装它,但听起来不像已经安装了?或者是否有我需要禁用的隐藏 ClickOnce 设置? 您可以试试这个:***.com/a/31551026/1136211 并查看事件日志。 网核3.1中的ClickOnce?你在说什么?没有 ClickOnce... 【参考方案1】:

事实证明,Windows 10 使用某种缓存来实现“打开方式...”功能。

所以我上面的代码看起来没有执行的原因是因为它实际上没有执行 - 它实际上每次都在执行相同的旧版本代码(其中包含某种错误)。

如果您使用指定的 .exe 打开文件(例如文本文件),则该指定的 .exe 文件名(以及可能的程序集信息(例如版本号))将存储在缓存中。下次您打开具有相同指定 .exe 文件名(和程序集信息)的文件(例如文本文件)时,您选择的确切文件 - 指定的 .exe 文件路径实际上不会执行。相反,它将执行您第一次“打开方式”时使用的相同 .exe。请记住,每次我们主动浏览文件时,不是从“打开方式”列表中选择。

强制 Windows 10 使用您每次使用“打开方式...”(并主动浏览文件)时指定的确切 .exe 的一种简单方法是将 .exe 文件重命名为具有以前没用过。我还没有测试只更改程序集信息,所以我不确定这是否有效。

这又是 Windows 10 与常识相冲突的那些沉默的事情之一。

【讨论】:

以上是关于如果我使用“打开方式”,C# WPF 应用程序会静默崩溃的主要内容,如果未能解决你的问题,请参考以下文章

WPF(C#)的优秀开源报告工具/框架[关闭]

JetBrains Rider 不显示 C# WPF 异常

多线程任务更新 1 个进度条 - UI C# WPF

ItemsControl 组合框 selecteditem C# WPF MVVM

使用本地数据库的 WPF C# 应用程序

如何从选定的 WPF ComboBox 项 C# 中显示内容