终止应用程序时导致System.Runtime.InteropServices.COMException

时间:2013-05-24 12:31:30

标签: c# exception windows-8 navigation

我有一个带有2页calendar.xaml(起始页)和historystatistics.xaml的应用程序。当我导航到historystatistics并返回日历然后尝试通过下拉手势终止应用程序时,会引发错误。上述错误发生在App.xaml的OnSuspending中的SaveAsync函数中。

    private async void OnSuspending(object sender, SuspendingEventArgs e)
    {
        CycleManager cycMan = CycleManager.Instance;
        var deferral = e.SuspendingOperation.GetDeferral();
        //TODO: Save application state and stop any background activity
        if (cycMan.Reset != true)
        {
            await Appname.Common.SuspensionManager.SaveAsync(); // **ERROR**
        }
        deferral.Complete();          
    }

它说

  

“System.Runtime.InteropServices.COMException”类型的异常   发生在mscorlib.dll中,但未在用户代码中处理。

     

GetNavigationState不支持参数类型的序列化   它传递给了Frame.Navigate。

我哪里错了?我从xaml的historystatistics页面做了一个简单的导航,就像这样

<Button x:Name="backButton" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}" Style="{StaticResource BackButtonStyle}"/>

1 个答案:

答案 0 :(得分:0)

问题是SuspensionManager使用Frame.GetNavigationState()来获取Frame的历史记录。然后它尝试将导航历史序列化为字符串,遗憾的是它无法知道如何序列化自定义复杂类型。

来自MSDN

  

注意这些方法使用的序列化格式适用于内部   仅限使用。您的应用不应与其形成任何依赖关系。   此外,此格式仅支持基本类型的序列化   比如string,char,numeric和GUID类型。

此问题的最佳解决方案是重写NavigationParameter,或者如果您不想保存应用状态,只需注释该行:

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //await SuspensionManager.SaveAsync();
    deferral.Complete();
}