将 Prism.unity 6.2.0 添加到 Windows 10 UWP 后,应用程序抛出异常

After adding Prism.unity 6.2.0 to Windows 10 UWP, application throws exception

在使用 Prism 创建通用 Windows 应用程序时,我总是在 运行ning 应用程序时(或者有时在退出 运行ning 应用程序时)收到错误消息。以下是我为重现该问题所采取的步骤:

代码:

using Microsoft.Practices.Unity;
using Prism.Events;
using Prism.Mvvm;
using Prism.Unity.Windows;
using Prism.Windows.AppModel;
using Prism.Windows.Navigation;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Threading.Tasks;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.Resources;
using Windows.System;
using Windows.UI.Notifications;
using Windows.UI.Xaml;

namespace TestAppForPrism {
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App : PrismUnityApplication {

    public App() {
        this.InitializeComponent();
    }

    protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args) {
        NavigationService.Navigate("Main", null);
        return Task.FromResult<object>(null);
    }

    protected override Task OnInitializeAsync(IActivatedEventArgs args) {
        Container.RegisterInstance<INavigationService>(NavigationService);

        return base.OnInitializeAsync(args);
    }
}
}

当我运行申请时,抛出异常:

Could not load file or assembly 'System.Runtime.Serialization.Xml, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我设置不正确吗?

玩了一会儿,我想我找到了解决办法:

在 NuGet 控制台中,我 运行 "update-package -reinstall",然后重建解决方案。我仍然在错误 window 中收到一条警告,上面写着 "Found conflicts between different versions of the same dependent assembly that could not be resolved. These reference conflicts are listed in the build log when log verbosity is set to detailed.",但我似乎能够 运行 应用程序而不再收到该异常。

问题是 Visual Studio 2015 中的默认 UWP 模板仍然带有 "Microsoft.NETCore.UniversalWindowsPlatform": "5.1.0",而这应该是版本 5.2.2。

所以只需将该软件包更新到 5.2.2,一切都应该可以正常工作。


代码的小旁注:

  • return Task.CompletedTask 如果您不必执行任务。这是在 .NET 4.6 中添加的。它的性能更高一些。
  • 无需在您的容器中注册 INavigationService,这已在基础中完成 class。

因此您的代码可以精简为

sealed partial class App : PrismUnityApplication
{

    public App()
    {
        this.InitializeComponent();
    }

    protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
    {
        NavigationService.Navigate("Main", null);
        return Task.CompletedTask;
    }
}