作为在 AWS 的AppStream环境下测试我的应用程序的一部分,我遇到了一个异常,当我与任务栏交互时抛出异常(在我的例子中,设置自定义工具提示)。我已经能够使用这种代码在空白 WPF 应用程序中重现它:
private void Button_Click(object sender, RoutedEventArgs e)
{
TaskbarItemInfo = new System.Windows.Shell.TaskbarItemInfo { Description = DateTime.Now.ToLongTimeString() };
}
在 AppStream 中运行该代码会给出NotImplementedException
以下堆栈跟踪:
at MS.Internal.AppModel.ITaskbarList.HrInit()
at System.Windows.Window.ApplyTaskbarItemInfo()
at System.Windows.Window.OnTaskbarItemInfoChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.Window.<>c.<.cctor>b__0_0(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at My.App.MainWindow.Button_Click()
我发现这篇文章我认为是相同的潜在问题:ITaskbar HrInit 方法在 RemoteApp 下引发异常。有趣的是,我已经在 RemoteApp 中测试了该应用程序,它在那里运行良好。我猜微软从那时起改进了 RemoteApp 以避免在他们的平台上出现这个问题。
似乎在资源管理器未运行时发生异常 - 这是有道理的,因为当它不存在时很难与任务栏交谈。事实上,我已经能够通过杀死 explorer.exe 来重现同样的问题。
在另一个问题中提到的唯一潜在修复是查看SystemInformation.TerminalServerSession
以检测您何时在这种环境中运行并避免使用TaskbarItemInfo
. 这对我不起作用,因为它还会检测到正常的远程桌面连接——这对于我的应用程序来说是一个非常常见的用例,也是代码工作正常的情况。
我唯一能想到的另一件事是将代码行包装在 try/catch 块中,然后盲目地吞下任何可能出错的东西。这不是世界末日,因为如果没有我的自定义任务栏工具提示逻辑,该应用程序将运行良好。但这只是感觉....错了。几乎感觉这是 WPF 应该做的那种错误处理。我知道没有 explorer.exe 运行是一件奇怪的事情,但我听说有人使用备用 shell 或者(也许更有可能)看到 explorer.exe 不时崩溃。