我正在编写一个Xamarin.Forms应用程序并在我的Visual Studio 2013中的主要解决方案中添加了一个PCL项目。我在使用几个标准的.net类时遇到了问题。这是一个清单:
System.Net.IPAddress
System.Net.IPEndPoint
System.Net.WebClient
System.Net.Sockets.UdpClient
System.Timers.Timer
System.Timers.ElapsedEventArgs
System.Net.NetworkInformation.UnicastIPAddressInformation
我的问题是:如何找出上述哪些内容与Xamarin.Forms应用程序兼容,以及如何让它们在我的项目/解决方案中工作?
我已经联系了Xamarin的支持,但获得了模糊的帮助,而不是具体细节......
是否有人有一个很好的策略来确定支持哪些类以及需要什么.dll以便将它们与Xamarin.Forms项目一起使用?
非常感谢你的帮助。
PS:我已获得以下网站供参考,但它们似乎没有任何简明信息:
答案 0 :(得分:3)
听起来你不明白便携式类库实际上是什么。创建PCL时,可供您使用的.Net Framework类的子集取决于您选择的配置文件。配置文件是您的PCL可以支持的平台。在Xamarin中,默认配置文件是配置文件78.配置文件78支持.NET 4.5,WP8,Win8,WP Silverlight 8,Win Store 8,Xamarin.Android,Xamarin.iOS。因此,可用的类是与平台无关的类,它们在概要文件78中的所有平台上运行。
示例:查看System.Net.IPAddress的实现。该实现使用Sockets。在进一步检查此实现后,您可以看到System.Net.Sockets
只不过是围绕WinSock API的.NET包装器。 WinSock API是Windows专用的DLL,专用于Windows操作系列(ws2_32.dll)。因此,您现在可以看到System.Net.IPAddress是Windows Socks的高级抽象(为Windows平台构建)。由于Android和iOS等都不存在ws2_32.dll,因此无法使用此API,因为Profile 78指定我们需要支持其他非Windows平台。
另一个例子是System.Drawing.Bitmap。这只是围绕GDI+的.NET包装器,它基于Win32 API。当然,Win32在非Windows平台(甚至Windows Phone)上不可用,这就是为什么你不会在PCL中看到它。
现在有了这样说,你可能会认为PCL是限制性的,但如果你认为about them the right way,你可以创建一个好的PCL库。您还可以使用依赖注入和Bait and Switch等模式。
简而言之,不要指望微软“增加对所有基类库的支持”,因为这不是PCL的所在。
答案 1 :(得分:1)
您仍然可以通过使用DependancyService在Xamarin.Forms PCL中使用System.Net.IpAddress
。在PCL中创建一个接口,并在其中声明方法“ GetIpAddress”。然后,在android / iOS项目中,您可以在特定于平台的项目中实现该接口,并轻松访问System.Net.IpAddress.
。此后,从PCL项目中调用DependancyService以获得所需的IPAddress结果。
干杯!!!
答案 2 :(得分:0)
在收到Xamarin支持部门的一些额外电子邮件以及对我的其他帖子的评论之后,似乎MS在通过PCL支持所有课程方面落后了。有些人得到了支持,但并非所有人都受到了支持。
无论如何,为了使用我现有的代码,我需要把我原本用来创建我的新PCL项目的源.cs文件直接放在.iOS项目和.droid项目中并重新编译方式。
这基本上打败了使用PCL的优势,但确实提供了一种替代方案,允许我不改变地使用我的大部分代码。如果所有的xamarin库都可用作PCL,那就更好了。哦,最终MS将赶上并让他们的所有PCL更新,以便我们可以更频繁地使用我们的自定义PCL,而不必重复代码到处都是。 (维护梦魇)......
无论如何,感谢大家的帮助。
(在技术的最前沿工作有时很痛苦......但这就是我们赚大钱的原因!!!)