Xamarin.UWP Необработанное исключение во время запуска - PullRequest
0 голосов
/ 17 апреля 2019

Моя цель - расширить существующий проект Xamarin с помощью UWP .

У меня есть два общих проекта, X. mobile.shared и X. application.shared , поэтому я добавил ссылку на проект Uwp к этим двум проектам.

После выполнения действий по добавлению uwp из документация , я также установил все пакеты Nuget, доступные в этих общих проектах, как отмечается в ответе на эту проблему .

Теперь, когда я отлаживаю проект UWP, я не получаю никакой ошибки, кроме необработанного исключения , я попытался указать точку, которая вызывает это исключение, иЯ обнаружил, что раскомментируя эту строку:

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

Вызывает необработанное исключение:

unhandled exception

Сообщение содержит, как вы видите визображение:

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

, что означает, что имеется ссылка на нулевой объект!

Что я делаю не так?

Обновление

С точкой останова на линии, вызывающей ошибку, я попытался увидеть, что значение метода - аргументы, я обнаружил, что DeclaringMethod , вызываемый typeofMain () возвращает " 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 ]

1 голос
/ 17 апреля 2019

Согласно исключению это происходит во время DependencyResolver.Resolve<T> звонка. DependencyResolver - это класс в Xamarin.Forms , который действует как «локатор службы».

У меня нет доступа к исходному коду, но это означает, что есть служба, требующая реализации для конкретной платформы, которая не предусмотрена в проекте UWP.

Проверьте трассировку стека для исключения, и вы сможете увидеть, где отсутствовала зависимость, а затем сможете определить, что необходимо реализовать. Я предлагаю вам обратить особое внимание на ViewModel первого представления, которое загружается так, как кажется, там требуется служба (приложение сразу запускается).

Подробнее о том, как внедрение зависимостей работает в Xamarin. Формы см. В Документах .

0 голосов
/ 18 апреля 2019

Я получил ответ от github xamarin-docs , в котором говорится, что для расширения существующего проекта UWP с помощью UWP все пакеты nuget, которые вы используете в своем решении, должны иметь поддержку дляUWP (не только те, которые существуют в .shared ).

В моем решении у меня есть много пакетов, которые не поддерживают UWP, например:

ACRSupport поддерживает только android и ios

В заключение, проект aspnetzero не может быть расширен для использования UWP.

ОБНОВЛЕНИЕ ОТВЕТА:

Сотрудник моей организации нашел решение, справившись с реализацией проекта *. Droid .

Этот ответ полезен для пользователя aspBoilerplate , в частности aspnetzero пользователь, который хочет расширить свой проект с помощью UWP .

Вот шаги, чтобы заставить его работать:

  1. Сначала следуйте этому руководству
  2. Если вы запустите свой проект после первыхНа этом шаге вы можете быть удивлены « необработанное исключение = Ссылка на объект не установлена ​​на экземпляр объекта. », это происходит потому, что контейнер инъекции зависимости (он же локатор службы)не могу найти регистрацию вашего uwp abpmodule , поэтому:

    2.1.Определите модуль для вашего проекта добавления Uwp (Add> 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 используется для регистрации класса модуля.

  3. in App.xaml.cs s 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();
         });
    
      }
    
  4. Добавьте эти пакеты Nuget в ваш проект UWP:

    Xamarin.forms (убедитесь, что это то же самое)версия с вашим *. Mobile.shared проектом)

    Win2D.uwp

  5. Наконец из вашего проекта uwp добавьтессылка на Acme.PhoneBook.Mobile.shared , Acme.PhoneBook.Application.shared & Acme.PhoneBook.Application.Core

И это все, он будет работать для вас, как и для меня

...