如果我使用 "open with",C# WPF 应用程序会自动崩溃
C# WPF App silently crashes if I use "open with"
我正在用 C# WPF 制作一个文本编辑器。将项目发布到文件夹后,我可以双击 .exe,它运行良好,我可以使用我的打开 (CTRL+O) 功能完美加载文件。
我想使用 打开方式 > 选择另一个应用 > 更多应用 > 在此 PC 上寻找另一个应用
(我还不担心文件关联 - 在开发过程中这很好)
这就是问题所在 - 无论我对我的代码做什么,当我使用此方法打开它时,我都无法让我的应用程序执行任何有用的操作。发生的事情是它会弹出一个随机大小的白色 window 并且看起来很忙 - 2 秒后它会自行关闭。 window 的名称是“%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);
}
}
}
}
如您所见,我删除了所有有用的代码以尝试让它做一些事情 - 我什至没有打开主程序 window,我只是想让它输出命令行参数。当我使用“在此 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”设置?
事实证明,Windows 10 使用某种缓存来实现“打开方式...”功能。
所以我上面的代码之所以看起来没有执行,是因为它实际上没有执行——它实际上每次都在执行相同的旧版本代码(其中包含某种错误)。
如果您使用指定的 .exe 打开文件(例如文本文件),则指定的 .exe 文件名(可能还有程序集信息(例如版本号))将存储在缓存中。下次您打开具有相同指定 .exe 文件名(和程序集信息)的文件(例如文本文件)时,您选择的确切文件 - 指定的 .exe 文件路径将不会实际执行。相反,它将执行您第一次“打开方式”时使用的相同 .exe。请记住,每次我们主动浏览文件,而不是从“打开方式”列表中选择时。
强制 Windows 10 使用您每次使用“打开方式...”(并主动浏览文件)时指定的确切 .exe 的一种简单方法是重命名 .exe文件到一个以前没有使用过的名字。我还没有测试过只更改程序集信息,所以我不确定这是否有效。
这又是那些沉默的 Windows 10 件与常识相冲突的事情之一。
我正在用 C# WPF 制作一个文本编辑器。将项目发布到文件夹后,我可以双击 .exe,它运行良好,我可以使用我的打开 (CTRL+O) 功能完美加载文件。
我想使用 打开方式 > 选择另一个应用 > 更多应用 > 在此 PC 上寻找另一个应用 (我还不担心文件关联 - 在开发过程中这很好)
这就是问题所在 - 无论我对我的代码做什么,当我使用此方法打开它时,我都无法让我的应用程序执行任何有用的操作。发生的事情是它会弹出一个随机大小的白色 window 并且看起来很忙 - 2 秒后它会自行关闭。 window 的名称是“%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);
}
}
}
}
如您所见,我删除了所有有用的代码以尝试让它做一些事情 - 我什至没有打开主程序 window,我只是想让它输出命令行参数。当我使用“在此 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”设置?
事实证明,Windows 10 使用某种缓存来实现“打开方式...”功能。
所以我上面的代码之所以看起来没有执行,是因为它实际上没有执行——它实际上每次都在执行相同的旧版本代码(其中包含某种错误)。
如果您使用指定的 .exe 打开文件(例如文本文件),则指定的 .exe 文件名(可能还有程序集信息(例如版本号))将存储在缓存中。下次您打开具有相同指定 .exe 文件名(和程序集信息)的文件(例如文本文件)时,您选择的确切文件 - 指定的 .exe 文件路径将不会实际执行。相反,它将执行您第一次“打开方式”时使用的相同 .exe。请记住,每次我们主动浏览文件,而不是从“打开方式”列表中选择时。
强制 Windows 10 使用您每次使用“打开方式...”(并主动浏览文件)时指定的确切 .exe 的一种简单方法是重命名 .exe文件到一个以前没有使用过的名字。我还没有测试过只更改程序集信息,所以我不确定这是否有效。
这又是那些沉默的 Windows 10 件与常识相冲突的事情之一。