我的目标是使用 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);
触发未处理的异常:
消息包含,如您在图像中看到的:
Message "Object reference not set to an instance of an object."
这意味着存在对空对象的引用!
我在做什么错了?
在ligne上有一个BreakPoint触发错误,我试图看到方法的值是arguments,我发现由 typeofMain()调用的 DeclaringMethod 正在返回"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();
答案 0 :(得分:1)
根据异常,它发生在DependencyResolver.Resolve<T>
调用期间。 DependencyResolver
是class 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>。
这是使其正常工作的步骤:
如果在第一步之后运行项目,则可能会因“ 未处理的异常 = 对象引用未设置为对象实例”而感到惊讶。”,这是因为依赖注入容器(又名服务定位器)找不到您的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用于注册模块类。
在 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
将这些Nuget软件包添加到您的Uwp项目中:
Xamarin.forms(确保与您的 *。Mobile.shared 项目版本相同)
最后在uwp项目中,添加对 Acme.PhoneBook.Mobile.shared , Acme.PhoneBook.Application.shared 和 Acme的引用.PhoneBook.Application.Core
就是这样,它将为您运行,就像对我一样