[英]Xamarin.UWP Unhandled Exception during launch
我的目标是使用UWP扩展现有的Xamarin项目 。
我有两个共享项目,十mobile.shared和X. application.shared,所以我对UWP项目这两项目添加引用。
在按照从文档中添加uwp的步骤进行操作之后,我还安装了这些共享项目中所有可用的Nuget软件包,正如在回答这些问题中所指出的那样。
现在,当我调试UWP项目时, 除了未处理的异常外 ,我没有得到任何错误,我试图指出触发该异常的ligne,然后发现取消注释此行:
rootFrame.Navigate(typeof(MainPage), e.Arguments);
触发未处理的异常:
如该图所示,该消息包含:
Message "Object reference not set to an instance of an object."
这意味着存在对空对象的引用!
我究竟做错了什么 ?
随着对LIGNE触发错误断点,我试图看到该方法的值是参数,我发现,通过DeclaringMethod称为typeofMain()被返回“SystemInvalidOpertaionException” 。
那是什么意思 ?
得到@Martin Zikmund的建议后,我检查了堆栈跟踪,发现问题发生在:
Acme.PhoneBookDemo.Core.Dependency.DependencyResolver.Resolve[T]()\r\n at Acme.PhoneBookDemo.App.OnStart()
回到该类,这是OnStart()方法的代码:
protected override async void OnStart()
{
base.OnStart();
if (Device.RuntimePlatform == Device.iOS)
{
SetInitialScreenForIos();
await UserConfigurationManager.GetIfNeedsAsync();
}
await DependencyResolver.Resolve<INavigationService>().InitializeAsync();
OnResume();
}
当调试器到达以下行时,将触发该问题:
await DependencyResolver.Resolve<INavigationService>().InitializeAsync();
根据异常,它发生在DependencyResolver.Resolve<T>
调用期间。 DependencyResolver
是Xamarin.Forms中的一个类 ,充当“服务定位器”。
我无权访问源代码,但这意味着有一项服务需要特定于平台的实现,而UWP项目中未提供该服务。
检查堆栈跟踪中的异常,您应该能够看到缺少依赖项的地方,然后能够告诉我们需要实现什么。我建议您应该特别看一下加载的第一个视图的ViewModel
该服务是必需的(应用在启动时立即崩溃)。
有关Xamarin.Forms中依赖注入的工作方式的详细信息,请参阅文档 。
我收到了xamarin-docs的github的回复,告诉我们为了使用UWP扩展现有的UWP项目,您在解决方案中使用的所有nuget软件包都应支持UWP(不仅是.shared中存在的软件包 )。 。
在我的解决方案中,我有很多不支持UWP的软件包,例如:
ACRSupport仅支持android和ios
总之,aspnetzero的项目无法扩展为使用UWP。
我组织中的一位同事通过应对* .droid项目的实施找到了解决方案。
该答案对于想要用UWP扩展其项目的aspBoilerplate用户(特别是aspnetzero用户)很有用。
这是使它起作用的步骤:
如果在第一步之后运行项目,则可能会因“ 未处理的异常 = 对象引用未设置为对象的实例。 ”而感到惊讶,这是因为依赖注入容器(又名服务定位器)找不到注册您的uwp abpmodule ,所以:
2.1。 为添加的Uwp项目定义一个模块(添加> NewItem> PhoneBookDemoXamarinUwpModule.cs):
using Abp.Modules; using Abp.Reflection.Extensions; namespace Acme.PhoneBookDemo { [DependsOn(typeof(PhoneBookDemoXamarinSharedModule))] public class PhoneBookDemoXamarinUwpModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(typeof(PhoneBookDemoXamarinUwpModule).GetAssembly()); } } }
在上面的initialize方法中,我们注册依赖项,IocManager用于注册模块类。
在App.xaml.cs的OnLaunched()方法中,添加以下行:
//rootFrame.NavigationFailed += OnNavigationFailed; ApplicationBootstrapper.InitializeIfNeeds<PhoneBookDemoXamarinUwpModule>(); await StartUpApplicationAsync(); //Xamarin.Forms.Forms.Init(e); // requires the `e` parameter
然后添加以下方法:
private async Task StartUpApplicationAsync() { await UserConfigurationManager.GetIfNeedsAsync(); } private static void ConfigureFlurlHttp() { FlurlHttp.Configure(c => { c.HttpClientFactory = new ModernHttpClientFactory(); }); }
将这些Nuget软件包添加到您的Uwp项目中:
Xamarin.forms (确保与您的* .Mobile.shared项目的版本相同)
最后,从uwp项目中,添加对Acme.PhoneBook.Mobile.shared , Acme.PhoneBook.Application.shared和Acme.PhoneBook.Application.Core的引用
就是这样,它将为您运行,就像对我一样
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.