编者语:Xamarin在国内的推广还需要努力,其实这真的是移动端开发的一大福音,毕竟用一份代码的时间可以生成iOS/Android/Windows/Linux/macOS/Tizen多个平台,而且是原生的性能。Xamarin在Build 2018发布的新功能有Xamarin.Essentials(点击查看) , Hyper-V for Xamarin Android Emulator ,还有Xamarin.Forms 3.0。Xamarin.Forms 3.0 和 Xamarin.Essentials 都会是一个质的飞跃。Xamarin.Forms 有全新的布局FlexLayout ,更好地和原生控件对接,还新增支持GTK+/Tizen。而Xamarin.Essentials的发布则大大提升开发的效率,把因为平台差异造成的代码不一致的底层接口重新做了归一,这样做提升了编码效率。

在Build2018前的两周左右,我拿到了Xamarin.Essentials的测试版本(基于nda我只能等到现在才能发布),这是一个为访问一些设备硬件和底层给iOS/Android/UWP三个平台做的统一接口,适配了.NET Standard 2.0(当然也包含.NET Standard 1.0 / iOS / Android)。通过Xamarin.Essentails你可以非常快捷地访问不同平台的摄像头,地理位置,网络检测,更能调用如打电话,相册,通讯录等相当方便实用。如我需要了解设备信息的时候,通过Xamarin.Essentails就是一句非常简单的话就可以完成了

运行生成效果

话说回来,在Xamarin.Essential之前,其实Xamarin也推出了Xamarin.Mobile(点击查看)和Plugin(点击查看) 。我们先来看看这两位旧人所做的事,如果对比代码其实也差不多,通过PCL的方式对设备底层API进行访问。(ps : 图一是Xamarin.Mobile , 图二Xamarin.Plugins)
         
      看看上面的代码是比较有趣,可以预想到用原生方法写一个摄像头调用你可能需要更多的工作,而且这更接近.NET程序员的使用习惯。假若你希望为Xamarin打造一个跨平台的,也能针对不同平台底层操作,又有一个通用接口的库,这三个通用组件的源码就是很好的教程。
      在Xamarin中实现跨平台访问,方法有几种:
      1. 通过检测平台的方式,最常用的是宏定义

<span style="font-size:12px;">
#if __IOS__

// iOS-specific code

#endif

#if __TVOS__

// tv-specific stuff

#endif

#if __WATCHOS__

// watch-specific stuff

#endif

#if __ANDROID__

// Android-specific code

#endif

</span>
  2. 或者通过代码的方式, Xamarin.Forms.Device.Idiom去完成

<span style="font-size:12px;">          
          if (Xamarin.Forms.Device.Idiom == TargetIdiom.Phone)

{

MainPage = new NavigationPage(new MyPage());

}

else if(Xamarin.Forms.Device.Idiom == TargetIdiom.Tablet)

{

// etc

}

else if(Xamarin.Forms.Device.Idiom == TargetIdiom.Desktop)

{

// etc

}

else if (Xamarin.Forms.Device.Idiom == TargetIdiom.Unsupported)

{

// etc

}

else

{

// etc

}</span>

这个方式除了在代码也可以在XAML

<span style="font-size:12px;">   
<OnIdiom x:TypeArguments="View">

<OnIdiom.Phone>

<Grid>

<Label Text="Phone content view" />

</Grid>

</OnIdiom.Phone>

<OnIdiom.Tablet>

<Grid>

<Label Text="Tablet content view" />

</Grid>

</OnIdiom.Tablet>

</OnIdiom></span>

3. 用DependencyService,在通过公用层生成接口,再在不同平台上实现。这是在Xamarin中最常用的方法,
        
      回到封装库,首先要定下一个目标就是做个.NET Standard的库,而不再是做PCL. 还有做这种通用库更应该考虑兼容多平台,如iOS/Android/UWP等。以往的做法你可能需要搭建很多的目录,然后去继承一个公共接口去完成。现在通过MSBuild.Sdk.Extras(点击查看), 通过MSBuild可以对不同平台进行快速编译,生成跨平台的库。参考Xamarin.Essentials(点击进入),我自己开始编写一个简单的库。先看看实现原理(如图)

在.NET Standard 项目中你可以针对不同平台进行编译,利用第三方的MSBuild.Sdk.Extras进行不同平台库的生成工作,在这种方法上你不再需要上面提到的宏定义或Dependency Service,只需要针对预先设置好的文件进行跨平台编译,这大大方便了代码的管理和维护。xx.standard.cs是一个公用的文件,相当于为不同平台定义了一个接口,而具体实现放到各自平台上如xx.ios.cs , xx.android.cs ..... 最后通过shared封装公共方法暴露给不同项目访问。

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">

<PropertyGroup>

<!--Work around so the conditions work below-->

<TargetFrameworks>netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid71;</TargetFrameworks>

<Product>$(AssemblyName)($(TargetFramework))</Product>

<EnableDefaultCompileItems>false</EnableDefaultCompileItems>

<EnableDefaultItems>false</EnableDefaultItems>

<BuildOutputTargetFolder>$(TargetFramework)</BuildOutputTargetFolder>

</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)'=='Debug' ">

<DebugType>full</DebugType>

<DebugSymbols>true</DebugSymbols>

</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)'=='Release' ">

<DebugType>pdbonly</DebugType>

</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

<OutputPath>bin\Debug\$(TargetFramework)</OutputPath>

</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

<OutputPath>bin\Release\$(TargetFramework)</OutputPath>

</PropertyGroup>

<ItemGroup>

<PackageReference Include="MSBuild.Sdk.Extras" Version="1.4.0" PrivateAssets="All" />

<Compile Include="**\*.shared.cs" />

</ItemGroup>

<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard'))">

<Reference Include="System.Numerics" />

<Reference Include="System.Numerics.Vectors" />

<Compile Include="**\*.netstandard.cs" />

</ItemGroup>

<ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid'))">

<PackageReference Include="Xamarin.Android.Support.CustomTabs" Version="25.4.0.2" />

<PackageReference Include="Xamarin.Android.Support.Core.Utils" Version="25.4.0.2" />

<Reference Include="Mono.Android" />

<Reference Include="System.Numerics" />

<Reference Include="System.Numerics.Vectors" />

<Compile Include="**\*.android.cs" />

</ItemGroup>

<ItemGroup Condition=" $(TargetFramework.StartsWith('Xamarin.iOS'))">

<Reference Include="System.Numerics" />

<Reference Include="System.Numerics.Vectors" />

<Compile Include="**\*.ios.cs" />

</ItemGroup>

<Import Project="$(MSBuildSDKExtrasTargets)" Condition="Exists('$(MSBuildSDKExtrasTargets)')" />

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

</Project>

剩下的事情,就是针对不同平台作定义了
      如Kinfey.ios.cs

using System;

namespace DNDemo.Lib

{

public static partial class Kinfey

{

internal static string Check(){

return "iOS";

}

}

}

如Kinfey.android.cs

using System;

namespace DNDemo.Lib

{

public static partial class Kinfey

{

internal static string Check()

{

return "Android";

}

}

}

而Kinfey.netstandard.cs

using System;

namespace DNDemo.Lib

{

public static partial class Kinfey

{

internal static string Check() => throw new NotImplementedException();

}

}

最后暴露的接口在Kinfey.shared.cs

using System;

namespace DNDemo.Lib

{

public static partial class Kinfey

{

public static string CheckInfo(){

return Check();

}

}

}

这样你就可以进行编译了,在Windows上你直接用Visual Studio 编译即可,在macOS上你需要编译就需要用命令行了(请高人指点下,我不知道为啥VS for mac不能build跨平台的.NET Stanard......),首先你得restore , 接着执行
msbuild DNDemo.Lib.csproj /p:Configuration=Debug
这个时候,你就会得到四个库.net standard 1.0 / .net standard 2.0 / ios / android 。找个项目调用一下,结果如下:

赠送源码一份:(点击下载)
      最后Xamarin的第三方库在国外有不少,但国内还是相对较少,希望各位爱好者都贡献一下,为这个技术落地贡献一份力量。

原文地址: https://blog.csdn.net/kinfey/article/details/80218291


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

从Xamarin.Essentials谈Xamarin库的封装相关推荐

  1. Xamarin Essentials教程获取路径文件系统FileSystem

    Xamarin Essentials教程获取路径文件系统FileSystem 文件系统用于管理设备内的各类文件.通过文件系统,应用程序可以创建永久文件和临时文件,也可以获取预先打包的文件,如预设数据库 ...

  2. Xamarin Essentials教程磁力计Magnetometer

    Xamarin Essentials教程磁力计Magnetometer 磁力计也叫地磁.磁感器,可用于测试磁场强度和方向.在手持设备中,通过磁力计可以计算设备的左右.前后倾斜角度,广泛应用于手机各种的 ...

  3. Xamarin Essentials教程打开文件

    Xamarin Essentials教程打开文件 FileSystem类的OpenAppPackageFileAsync()方法可以用来打开App包中特定的文件,其语法形式如下: public sta ...

  4. Xamarin Essentials教程实现数据的传输功能实例

    Xamarin Essentials教程实现数据的传输功能实例 [示例1-1]以下将实现数据的传输功能.代码如下: public async Task ShareUri(string text, st ...

  5. Xamarin Essentials教程构建共享请求

    Xamarin Essentials教程构建共享请求 共享请求类ShareTextRequest可以用于构建复杂形式的数据,用于向其他应用传输.例如,它可以指定共享内容的主题Subject,用于给邮件 ...

  6. Xamarin Essentials教程数据处理传输数据

    Xamarin Essentials教程数据处理传输数据 在移动应用程序中,除了常规的数据处理,还涉及数据存储.数据传输.版本数据多个方面.Xamarin.Essentials组件提供了多个数据处理相 ...

  7. Xamarin Essentials教程地理定位Geolocation

    Xamarin Essentials教程地理定位Geolocation 通过地理定位功能,应用程序可以获取用户的当前地理位置,如经纬度值.利用地理位置,可以在地图上定位,也可以转化物理位置,划分用户的 ...

  8. Xamarin Essentials教程陀螺仪Gyroscope

    Xamarin Essentials教程陀螺仪Gyroscope 陀螺仪是用来检测设备在X.Y.Z轴上所旋转的角速度.应用程序通过陀螺仪可以获取设备在各个方向的转动角速度,可以实现更为丰富的控制功能, ...

  9. Xamarin Essentials教程使用指南针Compass

    Xamarin Essentials教程使用指南针Compass 指南针是一种确定地理方向的工具.在手机应用程序中,指南针通过手机的磁力计确定磁北极,提供手机方向信息.在Xamarin中,开发者可以使 ...

最新文章

  1. Python实现五子棋人机对战 | CSDN博文精选
  2. 更改as的默认gradle地址_面试官:谈谈这4种磁盘IO调度算法--CFQ、NOOP、Deadline、AS...
  3. IDEA不能导入List包
  4. 快慢指针____函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移
  5. SAP UI5 getHeaderFooterOptions
  6. ubuntu20.1 查看apt仓库_上海食品冷藏仓库出租查看
  7. php 通用购物车,PHP实现购物车代码[可重复使用]
  8. 卓金武——从数学建模到MATLAB
  9. C#学习笔记(十三):I/O操作
  10. USB TYPE A B C 引脚定义
  11. php 定义宏函数,汇编语言宏函数
  12. C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件
  13. Microsoft 解决方案框架版本 3.0 概述
  14. php 热区,jquery如何使热区锚点随图片大小尺寸改变而变化
  15. MATLAB科学计算机lnx代码,[2018年最新整理]Matlab科学计算.ppt
  16. 魔戒世界服务器维护,我的世界1.7.10服务器魔戒 The Lord of the Rings
  17. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第5章 CC2530继电器模块
  18. 社交里互评、点赞的实现
  19. STM32F429的LTDC和DMA2D
  20. 人工智能、数据挖掘、机器学习和深度学习之间,主要有什么关系?

热门文章

  1. 1、Locust压力测试环境搭建
  2. 使用CDN引用jQuery
  3. 【项目 报错】 项目启动,内存溢出 可能出现的各种报错
  4. ubuntu,kali linux和windows三系统流水账——写给自己
  5. 洛谷2296 寻找道路
  6. hadoop扩充磁盘操作记录
  7. Avalonia跨平台入门第十九篇之语音播放
  8. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
  9. Entity Framework Core 6.0 预览4 性能改进
  10. 如何在 .NET 中使用 Kafka