dll ios_unity dll ios - CSDN
  • 【坑】IOS DLL热更新

    2014-05-27 12:08:40
    我现在参与的项目是做MMO手游,目标平台是Android和iOSiOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码更新,不过实际上,在unity里要...

    我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码更新,不过实际上,在unity里要用上动态加载dll是有很多限制的(不了解的话就是坑)。

    限制1:在Android手机里动态加载dll不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte[] rawAssembly)这个接口,所以要自己想办法先读出来。

    限制2:动态加载的脚本不能在编辑器里挂在prefab上。

    限制3:如果脚本在动态dll里,调用AddComponent()挂此脚本上prefab上时不能使用AddComponent(“SomeScript”)的方式调用,要用AddComponent(Type.GetType(“SomeScript”))。

    限制4:在动态dll里使用[RequireComponent(typeof(SomeScript))]无效,所以不能使用。

    我目前主要就是遇到这些坑,以后有什么新发现再进行补充。

     

    修正&补充:在iOS下不是都不能动态加载dll,越狱的手机可以实现,具体可参考文章:http://blog.csdn.net/lucky_06/article/details/9093879,亲测没问题。

     

    再次修正:iOS实际上还是不能实现真正的代码热更新,使用上述方法只能调用外部dll的接口,但执行逻辑还是在native code里面。简单的说,之前我测试的时候是项目里面有a.dll的代码,然后再Assembly.Load a.dll进来,调用a.dll里面的方法是可以的,但实际是调用了项目里的代码,如果项目里没有a.dll的代码,调用会报错,以上。

    展开全文
  • 好久没写博客了,今天被一个问题困扰了好久,网上了查不到相应的解决方案,自行解决后才觉得还是写写博客吧,说不定能帮助别人少走弯路…… 首先说明我的运行环境:MAC系统版本号10.13.4, Unity版本号2018.1.0。...

        好久没写博客了,今天被一个问题困扰了好久,网上了查不到相应的解决方案,自行解决后才觉得还是写写博客吧,说不定能帮助别人少走弯路……

        首先说明我的运行环境:MAC系统版本号10.13.4, Unity版本号2018.1.0。解释下当前环境的问题,首先MAC系统升级到10.13版本后,文件系统改为了APFS格式,而Windows系统中的Unity 工程是在NTFS格式的文件系统中创建的,所以工程或文件导入MAC系统后,Unity旧版本会无法识别,而unity目前只有Unity2017beta更新了相关的支持,所以我是用了Unity2018版本。但是,也因此出现了一些问题……

        Unity工程的Plugins文件夹中经常会放入一些dll文件,而这些dll文件是在Windows系统中编译生成的,比如dll文件是封装的数据,用来序列化操作,其中一个类如下:

    /// <summary>
    /// 关卡数据
    /// </summary>
    [Serializable]
    public class LevelData {
    
        /// <summary>
        /// 关卡ID
        /// </summary>
        public int ID;
        /// <summary>
        /// 关卡等级
        /// </summary>
        public int level;
        /// <summary>
        /// 关卡名称
        /// </summary>
        public string name;
        /// <summary>
        /// 场景ID
        /// </summary>
        public int sceneID;
        /// <summary>
        /// 场景中的敌人id
        /// </summary>
        public int[] enemyIds;
        /// <summary>
        /// 每个敌人id对应的数量
        /// </summary>
        public int[] enemyCounts;
    }

        这样能保证我序列化和反序列化用到的是同一个的类,这里序列化和反序列化操作用的是BinaryFormatter的Serialize和Deserialize方法,具体的不再解释。当我把数据序列成二进制文件后,MAC的编辑器下运行反序列化没有任何问题,但是打包到IOS端运行后,反序列化二进制文件会异常……例如反序列化二进制为上面的LevelData,会提示System.Runtime.Serialization.SerializationException: Field "name" not found in class LevelData……大概意思是找不到name字段,就算修改了字段名,也会提示找不到其他字段……

        这个问题非常莫名其妙,排查了好久,最后干脆把dll文件删掉,直接将dll中的源码放入Unity工程中使用,例如LevelData脚本就会放入,这样会被自动编译到Unity工程的程序集文件中。这样运行后发现问题解决了……

        最后问了下以前公司的大佬,他们把Unity工程打包IOS时,是通过移动硬盘在MAC电脑上打包的,而移动硬盘的格式非NTFS的,而是MAC-OS扩展(日志式),这样打包是可以正常使用Plugins中的dll文件的。MAC系统上显示的移动硬盘信息如图:

        其实就是指Unity的工程在Mac上打包不能用NTFS格式的磁盘,因为这是Windows系统格式的。也可以在Mac磁盘上进行分区,单独设置一个分区的格式为Mac OS(日志式)的,这样通过NTFS的硬盘拷贝的工程,直接拷贝到MAC的这个分区上进行打包操作即可。

        因此联想到问题的根源可能是文件系统的原因,因为用的是NTFS格式文件系统工程,就算拷贝到MAC系统上,文件保存的系统格式是不变的,导致打包后无法正常使用。具体的根源还请指导的大神告知……

        还有一种猜想解决方案,的Unity工程中使用的dll,在MAC系统上使用VS for Mac来生成,然后放入到Unity的Plugins文件夹,这样编译的dll就是Mac文件系统格式的。皆因自己无能,找不到MAC上的VS在哪查看和设置FrameWork .NET的版本,生成的dll版本是.NET6的,而Unity旧版本只支持.NET3.5以内的……望知晓的大佬指点下

    展开全文
  • 修改LitJson支持iOS

    2018-11-15 21:11:07
    后来做iOS版本的时候,发现LitJson中的JsonMapper使用了iOS限制使用的反射特性,不支持iOS平台。这时候如果换Json库,逻辑代码改动比较多。我就做了一些工作,让LitJson支持iOS。    json格式简洁,解析很简单,...

        我们项目刚做的时候主要面向WP平台,选择了功能相对丰富的LitJson。后来做iOS版本的时候,发现LitJson中的JsonMapper使用了iOS限制使用的反射特性,不支持iOS平台。这时候如果换Json库,逻辑代码改动比较多。我就做了一些工作,让LitJson支持iOS。

     

        json格式简洁,解析很简单,有一个开源的MiniJson,只有500行代码,简洁、高效。我把LitJson的解析模块换成了MiniJson,项目名命名为LitMiniJson。然后按照LitJson的接口,把除了“C#对象<-->字符串”序列化/反序列化之外的所有public接口重新实现了一下。主要有2个特性:1. 接口跟LitJson完全一致;2. 支持iOS、Android、WP8、Win8等平台。

     

        我们有两个游戏项目已经使用LitMiniJson近两年,从开发到上线,经历了比较充分的测试,稳定、可靠。欢迎大家使用,并反馈意见给我。

     

        项目传到了github上,请点LitMiniJson,也欢迎大家参与进来开发,把这个库做的更好。

    展开全文
  • 比如某个dll中有一个类: public class A { public A(){} } 如果工程中,没有显式调用 new A(),在使用il2cpp方式构建时,这个A()会被剔除掉。最终的程序包里也就没法找到这个默认构造了。解决办法:1、找一...

    比如某个dll中有一个类:

    public  class A {
        public A(){}
    }

    如果工程中,没有显式调用 new A(),在使用il2cpp方式构建时,这个A()会被剔除掉。最终的程序包里也就没法找到这个默认构造了。 
    解决办法: 
    1、找一个位置定义一个无用的静态实例,如 static A _unusedA = new A();这样就相当于A()被使用了,不会被剔除。问题是多了一个无用的对象在内存里。

    2、使用unity的link.xml,具体如下: 
    无论从减少安装包大小还是迎合unity64位IL2CPP默认就会打开StrippingLevel功能,通过库剖离来减少DLL的空间大小。 
    那么问题是我们自定义库使用了一些type,例如xml,或者webclient c#封装的http请求等,如果被任性解剖出去,那么肯定是不允许的。 
    可以在Assets/下添加link.xml文件来手动排除不被剖离的类。

     1 <linker>
     2        <assembly fullname="mscorlib">
     3             <type fullname="System.Reflection" preserve="all"/>
     4             <type fullname="System.Security.Cryptography" preserve="all"/>
     5             <type fullname="System.Runtime.CompilerServices" preserve="all"/>
     6             <type fullname="System.Runtime.InteropServices" preserve="all"/>
     7             <type fullname="System.Diagnostics" preserve="all"/>
     8             <type fullname="System.Security" preserve="all"/>
     9             <type fullname="System.Security.Permissions" preserve="all"/>
    10        </assembly>
    11 </linker>

     

    如上我们保持link.xml里面的格式这样既可 assembly其实就是dll库名,我们要排除这个dll库里面的 

    1:整个命名空间; 
    2:某个命名空间里面的某个具体类

    针对排除整个命名空间可以这样加:

    <assembly fullname="JsonDotNet">
                    <namespace fullname="Newtonsoft.Json" preserve="all"/>
    </assembly>

    关于查看dll库可以用默认的mono编辑器或者vs点进目录文件分类的dll就能看见了。 
    关于如何知道什么类或者命名空间你需要添加进去link.xml,只能你使用这个特殊命名空间才知道了。或者你通过xcode debug出错、eclipse debug真机运行时出错来查看那些类空间报错添加进去即可。

    转载于:https://www.cnblogs.com/dongzee/p/7406365.html

    展开全文
  • Protobuf在Unity使用DLL方式调用(IOS可用), 在真机上亲测
  • iOS加载dll

    2016-02-17 16:34:01
    //iphone #if UNITY_IPHONE || UNITY_IOS || UNITY_IPHONE_API GLogger.LogWarning ("3333333333333333333333333333333333333333333LoadAssembly"); Assembly[] array = System.AppDomain.
  • IOS为UNITY写插件/通信

    2015-04-02 11:31:47
    直接将.h .m 文件拷贝导Unity 》 Plugs>IOS 下,不要存在子文件夹;录音,百度SDK需要的库文件,在Unity导出IOS工程后需要再添加 #import #import "XHVoiceRecordHelper.h" #import "BDVRFileRecognizer.h" ...
  • ios android设备上使用 Protobuf (使用dll方式) http://game.ceeger.com/forum/read.php?tid=13479 如果你的工程可以以.Net 2.0 subset模式运行,请看这个帖子中的方法。 地址:...
  • C#端的处理 C#调用其他模块的接口都是通过DllImport的方式来实现的。 首先导入名字空间 using System.Runtime.InteropServices;...private static extern void __init (string app
  • 主要思路是替换掉在mono里image.c的
  • UnityEngine.UI.dll 路径

    2020-06-02 18:14:50
    2019.2之后,路径已经从 Unity安装目录下的Editor\Data\UnityExtensions移动到了 package里,通过package编译后生成的dll在工程目录下的library里
  • protobuf 最近使用protobuf,变编译工具时遇上一点问题.现在附上解决方案 编译过程 完全参照 ...编译出错 遇到如下错误 ./google/protobuf/objectivec-descriptor.pb.h:17:2: error: This file was ...
  • 1.Unity调用C++的Dll文件 这种情况主要用在Windows和Android平台。 大体步骤是: 1.生成DLL文件 2.放在Unity特定目录下,Plugins/目录 3.调用DLL代码 2.Unity调用Xcode的.a文件 大体步骤是: 1.在Xcode...
  • Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能。 但是没有提供在iOS工程中创建动态库的功能(苹果官方不允许程序中存在动态库链接,这样的程序会被AppStore拒),如下图: ...
  • 自行封装的LZMA接口库,用于unity,包括win平台的dll,安卓的so动态库和iOS的.a静态库 LZMA是目前压缩比最高的压缩算法,官方提供了多种语言的版本,unity中可以直接使用C#版,但是实际证明纯C版的压缩速度是C#版...
  •  项目使用il2cpp打包iOS 报错 [2019-01-03 20:48:58.113]|GameFramework|Can not load data table 'Worker' from 'Assets/GameMain/DataTables/Table_Worker.bytes' with error message 'System.Reflectio...
  • 原因,在Plugins下,有一个 ...System.Windows.Forms.dll 这个文件不能在IOS里出现, 所以要再属性里设置select platforms for plugin,里面不要包括IOS平台 搞了三天竟然就是这个小问题,唉 
  • 如果将原有的代码删除,编译时一切都还顺利,运行时就会出现mscorlib.dll文件找不到的错误。 结合我目前的实际情况(无证书调试)。 我将两段脚本拼凑了下,将如下的代码粘贴到Run Scripts处就一切OK了。 rm -rf...
  • 在Unity中,用到MySql数据库时,发布exe 的时侯报错,有关于dll的错误,解决问题所需dll文件。 把unity文件夹下Unity\Editor\Data\Mono\lib\mono\2.0 中的 这三个dll放到项目plugins中就可以了。
1 2 3 4 5 ... 20
收藏数 10,280
精华内容 4,112
关键字:

dll ios