C# 如何使用Xamarin的PCL项目和MvvmCross进行解析?

C# 如何使用Xamarin的PCL项目和MvvmCross进行解析?,c#,parsing,xamarin,mvvmcross,C#,Parsing,Xamarin,Mvvmcross,我在尝试与跨平台Xamarin应用程序集成时遇到了很多问题。起初,我能够使用Xamarin和MvvmCross创建Android应用程序,并通过在Xamarin中添加解析组件与解析服务集成。到了开发iOS应用程序的时候,我很难将Parse依赖项重构到核心PCL项目中,因为Parse目前不支持Xamarin PCL项目。因此,并没有可以添加到PCL项目中的Parse NuGet包或Xamarin组件。我可以很容易地将解析组件分别添加到iOS项目和Android项目中,但这需要在这两个项目中进行大量

我在尝试与跨平台Xamarin应用程序集成时遇到了很多问题。起初,我能够使用Xamarin和MvvmCross创建Android应用程序,并通过在Xamarin中添加解析组件与解析服务集成。到了开发iOS应用程序的时候,我很难将Parse依赖项重构到核心PCL项目中,因为Parse目前不支持Xamarin PCL项目。因此,并没有可以添加到PCL项目中的Parse NuGet包或Xamarin组件。我可以很容易地将解析组件分别添加到iOS项目和Android项目中,但这需要在这两个项目中进行大量代码复制

我已经读到,在核心项目中引用Parse.dll和Parse.NetFx45.dll使我能够在核心项目中使用解析调用。我做到了这一点,并且能够成功地编译所有内容。但是,当我尝试使用ParseClient.InitializeApplicationID,DotNetKey;,在核心项目中初始化解析时;,我在运行时收到TypeInitializationException


问题是,将Parse服务与Xamarin&MvvmCross-platform应用程序集成的最佳方式是什么?我想很多人都会这么做,但找不到参考文献/例子。在iOS和Android项目中复制代码肯定不是一个好办法。

所以我通过在所有3个项目Core、iOS和Android中引用Parse.Android.dll,在Android和iOS上都能正常工作。是的,这听起来很奇怪,但这正是我想要的。只需转到Android部分下载Xamarin SDK。它也能创造奇迹!没有代码重复,没有混乱:

为Mvvmcross创建解析插件不是最好的方法吗?定义要使用的接口的位置


在每个特定于平台的库中,您引用parse dll并调用该方法。因此,在您的核心项目中,您应该能够调用IParse.methods…

以下是一些想法:

首先,如果您当前正在手动将解析代码更改从一个项目复制到另一个项目,则可以通过编写运行的脚本将某些文件克隆到另一个项目来加快该过程。或者,您可以编写一个grunt脚本,在检测到更改时自动复制文件

现在,有另一种方法将解析代码存储在一个项目中,但跨平台共享:

问题是:我使用了一个共享项目而不是PCL来存放我的Xamarin.Forms和解析代码。解析代码运行得很好,但我在XAML的ContentPage中尝试使用自己的自定义ContentView时遇到了问题。我想要一个解决方案,使我的自定义ContentView能够与我的解析代码一样工作——两者都来自同一个项目

解决方案:我现在已经把Xamarin.Forms和解析代码放在PCL中。但有一个小陷阱。在我解释捕获之前,只需知道,除了每个平台的特定项目中的一行解析初始化代码外,它不需要重复解析代码

有什么问题吗?问题在于,在可移植类库中,您必须根据当时的编译目的手动交换Parse.iOS.dll或Parse.Android.dll

它会增加文件大小吗?否。我使用共享项目对我的应用程序进行了测试,在共享项目中,它使用平台项目对解析dll的引用,而在可移植类库中,您必须在平台项目以及PCL中添加对dll的引用,并且通过这种方式,没有发现应用程序文件大小的增加

以下是我目前正在使用的项目结构,为了保密,重命名了项目名称。仅供参考:我正在为Mac使用Xamarin

MyProject.iOS
 - Reference to Parse.iOS.dll
 - Reference to the Portable Class Library
MyProject.Android
 - Reference to Parse.iOS.dll
 - Reference to the Portable Class Library
Portable Class Library
 - Parse Code
 - Xamarin Forms Code
 - Reference to either Parse.iOS.dll or Parse.Android.dll
重要提示:在交换PCL中的DLL时,我发现如果右键单击“引用”菜单下的DLL,然后单击“删除”,则会在我的项目中引发问题,iOS项目将不再编译,因为它仍在查找Parse.Android.DLL,反之亦然。我尝试清理解决方案,从解决方案的文件系统中删除bin和obj文件夹,但没有成功。我通过这样做使它再次工作:右键单击引用,单击编辑引用,然后取消选中一个解析DLL并选中另一个的复选框。然而,在那之后,我再次尝试了Delete方法,并且没有遇到编译问题。谁知道呢,也许那个问题会再次出现在我身上

这不是很烦人吗?根据您在平台之间切换的频率,手动交换DLL可能会或可能不会变得烦人。不管这有多烦人,它都不会比有重复的代码更糟糕。也许这个交换过程可以用脚本自动完成?我认为如果您使用脚本修改.csproj,您必须卸载PCL并重新加载它。有人愿意接受挑战吗?或者,也许有一种方法可以基于 它是为e平台编译的。有人吗


我希望这有帮助。如果您喜欢这些想法中的任何一个,而不是您目前正在做的事情,请接受这一答案,并让我们知道您决定采用哪种路线。

注意,在iOS上,当您这样做时,iOS中将需要包含Mono.Android运行时,这将导致应用程序规模巨大!也许这毕竟不是最好的方法:你有没有找到一种很好的方法让解析在不重复解析逻辑和不让iOS应用程序庞大的情况下同时适用于iOS和Android?AnthonyTietjen我们最终将需要与解析交互的代码放入特定平台项目的类中。这些类实现了在Core中定义的接口。假设我想在位于Core的ViewModel中查询销售总数,我将调用await ISomeParse.GetNumberOfSales。Droid/iOS类中的代码除了名称空间之外是相同的,它们实现了相同的接口。所以不幸的是涉及到代码重复,但它工作得相当好。要更新代码时,请确保其他项目中的其他副本已更新。@AnthonyTietjen另外,在每个特定于平台的项目中,请分别引用Parse dll-Parse.Touch.dll(对于iOS),Parse.Droid.dll(对于Droid)。如果你找到了更好的方法,请让我们都知道:SharpMobileCode在这个URL上解释了一个更好的解决方案:确保看到我在他的回复中添加了什么。我已经确认,该解决方案适用于我的iOS项目和共享类库。我还没有确认它是否适用于Android,因为我现在还没有针对Xamarin.Forms的Android Xamarin许可证,但我非常希望它能工作。好主意,但它仍然会导致代码重复,因为两个平台的代码完全相同。这两个平台之间唯一的区别是需要引用的dll。是的,但是你可以创建一些类似SQLite aplugin的东西。。。核心中的共享代码,用于所有平台,它们作为链接添加到specifics Platform插件中