前言

众所周知,Xamarin应该是.net下的跨平台开发工具。2016年之前还处于收费状态,后被微软收购后开源。但似乎有个现象,开源后的Xamarin发展似乎有些停滞,而且维护Xamarin的团队又很固执不愿变通。社区多次建议UI层应该统一绘图引擎,而不是映射原生控件。Xamarin.Forms给人的感觉就是性能差,动画僵硬,效果不好实现。以至于谷歌的Flutter火爆之后,Xamarin社区很多人便转移阵地,你在百度搜索Xamarin,第一个关键词就是xamarin还有人用么。那么对于C#/.net开发者来说,唯一的问题就是界面,就有了开源项目Xamarin.Flutter,但过完年没多久,项目就Archived了,adamped说仅靠他和几个开发人员的业余时间很难搞定。但技术上确实可行,因为Skia在.net下本来就有绑定SkiaSharp,而Flutter底层便使用的Skia引擎。UIWidgets就是在Unity3D下的Flutter实现。那对于我们.net开发者有没有一种可能就是界面使用Flutter,业务逻辑采用C#呢,答案是可行的,请看如下分解。

环境

为了能够使用Flutter调用C#,需要如下工具和环境

  • Flutter环境

  • vs2015或者vs2017,并且包含Xamarin安装。

  • Android Studio, Android SDK,NDKr15c(https://dl.google.com/android/repository/android-ndk-r15c-windows-x86_64.zip)

  • jdk 1.8

  • Embeddinator-4000

前面四项不在赘述,请参考官方文档,确保Flutter,Xamarin可以运行项目,Android ndk请使用r15c版本,目前好像仅支持r15c,其他未测试。

Embeddinator-4000是将C#转化为各平台本机代码的工具,可以使用Nuget安装

Install-Package Embeddinator-4000 -Version 0.4.0

将工具路径添加到系统环境PATH,建议添加nuget的全局缓存,类似C:\Users\Administrator\.nuget\packages\embeddinator-4000\0.4.0\tools

如果工具使用出错,请检查sdk,或ndk版本,并确认Xamarin设置sdk,ndk路径正确。并将如下信息添加进注册表

Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Novell][HKEY_CURRENT_USER\Software\Novell\Mono for Android]
"AndroidNdkDirectory"="C:\\Program Files (x86)\\Android\\android-sdk\\ndk-bundle"
"AndroidSdkDirectory"="C:\\Program Files (x86)\\Android\\android-sdk"
"JavaSdkDirectory"="C:\\Program Files\\Android\\jdk\\microsoft_dist_openjdk_1.8.0.25\\"`

因为目前visualstudio的注册表信息都是对立文件形式,这可能是工具本身的BUG,参加https://github.com/mono/Embeddinator-4000/issues/707

使用方法

1. 创建C#类库(这里只实现Android 下的方法,iOS类推)

这里我们先创建一个类库,我们使用Android Class Lib,如果不是Android 的方法,也可以创建普通的类库

编译后得到Test4Flutter.dll, 运行如下命令

Embeddinator-4000.exe --gen=java -out=test .\Test4Flutter.dll -p=Android -c

出现MSBUILD : error MSB1008: 只能指定一个项目。请确保路径下没有空格,或者复制dll到其他路径重试

在test目录下我们得到一个Test4Flutter.aar文件

2.创建一个Flutter插件

Android 里添加Module,具体参考文档,将Module添加进依赖。

![dump_2046261408567477536](C:\Users\Administrator\Desktop\dump_2046261408567477536.png)  public void onMethodCall(MethodCall call, Result result) {if (call.method.equals("getPlatformVersion")) {result.success("Android " + android.os.Build.VERSION.RELEASE);}else if (call.method.equals("getHelloString")){result.success(test.getHelloString());}else if(call.method.equals("add")){result.success(test.add((int)call.argument("x"),(int)call.argument("y")));}else {result.notImplemented();}}static Future<String> getHelloString() async {return await _channel.invokeMethod('getHelloString');}static Future<int> add(int x,int y) async{final int ret = await _channel.invokeMethod('add',<String, dynamic>{'x': x,'y': y,});return ret;}

example内调用测试

调用方法时控制台会打印如下


很多时候我们应该摒弃语言之争,语言并无好坏,甚至可以将其融合


奇淫巧技-Flutter调用C#相关推荐

  1. 开发奇淫巧技Tips(Android篇)

    没事会记录下开发的奇淫巧技,每个tips前都会标明开发语言,有更多更好的奇淫巧技可以发评论或者私聊,可以添加进来 1.Kotlin:View调用此方法传入url加载网络图片,如果是ImageView则 ...

  2. 【C#冷知识系列】(一)那些你知道或者不知道的奇淫巧技

    引子 正如我在个人介绍中所写,我是一个仍然坚持.NET的头铁高级软件工程师,研究C#,.NET已经六年多,一直坚持认为自己的能力不足以教授别人,所以一直没有想法写博客.工作几年,内容涵盖了.NET框架 ...

  3. 多行文本注视 php,多行文本进行截断的奇淫巧技

    本篇文章给大家带来的内容是关于多行文本进行截断的奇淫巧技,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 单行文字的截断非常简单,但是多行文字的截断可谓是非常头疼,刚学css时候就为了 ...

  4. asa防火墙升级固件_奇淫巧技 | 在路由器中添加策略,阻止电视系统升级

    上一篇文章「长虹智能电视刷机降级,实现U盘安装第三方应用」中提到系统升级后会出现无法随意安装第三方应用的情况,当完成刷机后为了避免系统自动更新,你需要通过路由器阻止系统更新. 用openwrt类路由器 ...

  5. idea new对象后自动补全_IDEA的quot;奇淫巧技quot;

    本期吉大浪潮俱乐部给大家带来了IDEA的快捷键用法总结.废话不多说,让我们赶紧开始吧!!! IDEA的奇淫巧技 前言 奇淫巧技是第一生产力 -鲁迅 玩笑归玩笑,掌握IDEA的常用功能,不仅能提高开发效 ...

  6. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

    在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...

  7. 奇淫巧技的KMP算法--详解

    奇淫巧技的KMP算法–详解 花了一下午时间,看了十几个博客,终于拿下了KMP高地,现在总结下下自己对KMP的理解和实现. 情景1 假如你是一名生物学家,现在,你的面前有两段 DNA 序列 S 和 T, ...

  8. 源码解析中看到的奇淫巧技

    源码解析中看到的奇淫巧技 一. 数组重置 let arr = [123,123] arr.length // 2 arr.length = 0 arr // [] 当我们给数组的length 属性设置 ...

  9. [asp.net mvc 奇淫巧技] 05

    一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...

最新文章

  1. 滴滴CEO程维:当初把产品拿给美团王兴看,他说了两个字“垃圾”!
  2. 快速交付 敏捷开发的特点_什么是敏捷开发?它有什么特点
  3. 读书笔记-恰到好处的幸福
  4. 使用account lock或者account unlock语句
  5. leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
  6. 关于静态库、动态库的区别汇总
  7. Linux设备模型 (1)
  8. jvm maxgcpausemillis 默认值_Tomcat和JVM的性能调优总结
  9. java虚拟机文件_JAVA虚拟机已经安装,但不知道在哪儿编译和运行程序。
  10. smash:一个类unix内核
  11. 拓扑排序:编译依赖问题
  12. 温度检测单片机c语言程序设计,基于STC89C52单片机的温度检测系统设计
  13. matlab求工质热物性,以R245fa为工质的高温水源热泵样机研制及实验研究
  14. 长春甲骨文华育兴业|大数据社会的十三大具体应用场景
  15. k8s---存储之Volumes配置管理
  16. 张量网络系列(一 从张量到张量网络)
  17. 什么是jQuery,jQuery的特点。
  18. 中电海康-中电52所面经
  19. numpy 向量/矩阵的乘法
  20. Windows下创建隐藏账户、影子账户

热门文章

  1. jQuery中this与$(this)区别
  2. dropbox文件_Dropbox即将发布的扩展程序更新将添加更多文件编辑支持,包括Pixlr照片...
  3. 计算机存有多少游戏,8G和16G的计算机内存之间有很大区别吗?玩游戏需要多少内存?...
  4. php xxtea加密,php - esp32和php XXTEA字符串加密 - SO中文参考 - www.soinside.com
  5. 【C】C语言结构体指针的语法
  6. jQuery.extend()方法
  7. python UDP-数据报协议
  8. linux笔记 3-4 SMTP,.配置电子邮件传输
  9. 用sort()方法随机打乱数组
  10. 动态更改屏幕方向LANDSCAPE与PORTRAIT 转