Xamarin.UWP启动期间未处理的异常

时间:2019-04-17 07:46:33

标签: c# xamarin xamarin.forms uwp aspnetboilerplate

我的目标是使用 UWP 扩展existing Xamarin project

我有两个共享项目X. mobile.shared 和X. application.shared ,所以我添加了 Uwp 项目的参考到这两个项目。

按照步骤从the documentation添加uwp之后,我还安装了在这些共享项目中可用的所有Nuget软件包,正如在these issue的答案中指出的那样。

现在,当我调试UWP项目时,除了 未处理的异常 ,我没有得到任何错误,我试图指出触发该异常的ligne,发现取消注释此行:

 rootFrame.Navigate(typeof(MainPage), e.Arguments);

触发未处理的异常:

unhandled exception

消息包含,如您在图像中看到的:

    Message "Object reference not set to an instance of an object." 

这意味着存在对空对象的引用!

我在做什么错了?

更新

在ligne上有一个BreakPoint触发错误,我试图看到方法的值是arguments,我发现由 typeofMain()调用的 DeclaringMethod 正在返回"SystemInvalidOpertaionException"SystemInvalidOperationException

那是什么意思?

更新2

在获取@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();

2 个答案:

答案 0 :(得分:1)

根据异常,它发生在DependencyResolver.Resolve<T>调用期间。 DependencyResolverclass in Xamarin.Forms,充当“服务定位器”。

我无权访问源代码,但这意味着有一项服务需要特定于平台的实现,而UWP项目中未提供该服务。

检查堆栈跟踪中的异常,您应该能够看到缺少依赖项的地方,然后能够告诉我们需要实现什么。我建议您特别注意第一个的ViewModel加载的视图,似乎是该服务所必需的(应用程序在启动时立即崩溃)。

有关Xamarin.Forms中依赖项注入如何工作的详细信息,请参见Docs

答案 1 :(得分:0)

我收到xamarin-docs 's github的回复,告诉我们为了使用UWP扩展您现有的UWP项目,您在解决方案中使用的所有nuget软件包都应该支持UWP(不仅是那些存在于 .shared )中。

在我的解决方案中,我有很多不支持UWP的软件包,例如:

ACRSupport仅支持android和ios

总而言之,aspnetzero的项目无法扩展为使用UWP。

答案更新:

我组织中的同事通过应对 *。droid 项目的实施找到了解决方案。

此答案对于希望使用 UWP 扩展其项目的 aspBoilerplate 用户(尤其是 aspnetzero )用户有用。 strong>。

这是使其正常工作的步骤:

  1. 首先,跟随this tutorial
  2. 如果在第一步之后运行项目,则可能会因“ 未处理的异常 = 对象引用未设置为对象实例”而感到惊讶。”,这是因为依赖注入容器(又名服务定位器)找不到您的uwp abpmodule注册,所以:

    2.1。为添加的Uwp项目定义一个模块(Add> NewItem> PhoneBookDemoXamarinUwpModule.cs):

    bool LinkedList::addArtist(){
        cout << "Enter artist name: ";
        char *name = new char[0]();
        cin >> name;
        cin.ignore(1);
        '/n';
    
        cout << "Enter artists top story: ";
        char *topStory = new char[0];
        cin >> topStory;
        cin.ignore(1);
        '/n';
    
        cout << "Enter artist description: ";
        char *description = new char[0];
        cin >> description;
        cin.ignore(1);
        '/n';
    
        this->addAtBeginning(*&name, *&topStory, *&description);
    
        cout << "made it out" << endl;
        delete[] name;
        delete[] topStory;
        delete[] description;
        return true;
    }
    

    在上面的initialize方法中,我们注册了依赖项,IocManager用于注册模块类。

  3. App.xaml.cs OnLaunched()方法中,添加以下行:

     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());
                }
            }
        }
    

    然后添加此方法:

    //rootFrame.NavigationFailed += OnNavigationFailed;
    
      ApplicationBootstrapper.InitializeIfNeeds<PhoneBookDemoXamarinUwpModule>();
          await StartUpApplicationAsync();
    
     //Xamarin.Forms.Forms.Init(e); // requires the `e` parameter
    
  4. 将这些Nuget软件包添加到您的Uwp项目中:

    Xamarin.forms(确保与您的 *。Mobile.shared 项目版本相同)

    Win2D.uwp

  5. 最后在uwp项目中,添加对 Acme.PhoneBook.Mobile.shared Acme.PhoneBook.Application.shared Acme的引用.PhoneBook.Application.Core

就是这样,它将为您运行,就像对我一样