2016-10-09 iOS是支持反射的 .dll是能直接用的

     半个多月没写这个日记了,不知道还能不能坚持下去。不过这段时间倒是一直有写学习笔记,最近看了Unity5新出的assetbundle打包,C#的Attritebute,protobuf-net,md5,还有C#的流操作。
     下个项目要用protobuf做通信协议,于是昨天研究了一下,发现跟以前老王那个正反序列化差不多,不过感觉还是老王那个好用,至少能任意嵌套递归,不过在语言的通用性还有序列化的效率上确实还是这个protobuf好,毕竟是谷歌的东西,不过看了这个也让我更加佩服老王了,当初dh还说老王是国内1线的.net专家呢(这是真的吗?)。
     看这个protobuf-net的时候发现网上很多人都说在iOS上不好用,然后找到两个解决方案,
     一个是把消息模版类打成.dll的形式再反序列化。这个方案真的感觉不好,太麻烦了,如果以后想改这个类结构还得重打.dll。
     还有一个方法,直接把源码拉到工程里,不过这时候会报一个unsafe关键字的编译错误,这个是C#指针环境声明权限的一个错误,建个smcs.rsp文件就好了,用这个方法可以直接用.cs作为消息模版类,比上一个方法方便多了。不过也有看到有人说用这个方法最后也还是会报JIT异常,两个方法在iOS上我都没有测过,不知道是不是这样。唉,这种时候又想起“要是有台MAC就好了”。
     
     这两个解决方案让我感到很疑惑,.dll在iOS下明明是可以用的,为什么会报JIT异常呢?然后换成源码又好用了?这TM有什么区别啊。。。
     不过我猜可能.dll不好用也许也跟那个unsafe环境有关,也许用.dll的时候也加个smcs文件就好用了。不过也可能真像上面说的用源码其实也不好用,那就应该是代码本身就不支持了,跟是不是.dll根本没关系,如果是这样的话,猜测可能还是跟iOS下的反射有关。
     
     说到iOS下的反射,我的印象中iOS一直都是支持反射的,以前看热更的时候就有看到过了, iOS不能热更并不是不能用反射,而是不能用反射从外部动态加载程序集。毕竟反射里的像是GetType啊,typeof啊这些的,以前实习都还不知道反射是什么的时候就在用了,还有后来的遍历类结构什么的,也没见前辈们说这个不能用啊什么的。而且以前老王的框架本身就是基于反射实现的,也没说iOS发布不了或者他们换了别的方案啊什么的。还有Attribute那个特性标记,猜测也是用反射做的,那么多的开源框架,ulua,还有这个pb,里边肯定也用到反射了。所以iOS里一定是可以用反射的,奈何今天yq硬说iOS不支持反射,.dll也用不了,反倒还让我无力辩驳??无奈,我只好到群里像各位群友寻底气了,顺便想问下pb的这个.dll和源码两个方案到底是怎么回事,结果问了两个群,也没人能回答。。不过倒是让我有另一个发现。
     
     我一直都以为外部的.dll文件得放到plugins目录下才能用,晚上问这pb的事的时候,有群友 说纯粹的C#代码打出来的.dll文件在Unity里是直接可以用的,与.cs无异,并且并不用放到plugins目录下。于是我又打开了昨晚用来测pb的工程,删掉了源码,再把.dll文件拖到根目录下,果然没有报错(测试代码昨晚已经写过了),然后又运行了一下,果然也是可以用的。好吧,C#打的.dll果然是能直接用的。不过pb的两种解决方案又究竟是怎么回事?.dll与源码到底有什么不同?有没有朋友知道?留言告诉我下呗。再说一遍我的疑惑:
     pb的问题:.dll的方式在iOS下会报JIT错误
     两种解决方案:
     1、把消息把模版类都打成.dll再进行序列化。----------这不还是.dll吗,为什么这样就不报JIT错了?
     2、直接把源码放到工程目录下。-----------既然.dll可以直接用(iOS也是),这又有什么区别呢?

     还是说上边有哪种方案其实是错误的?并不是因为是.dll才报的JIT?(我也没去测过)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值