2018-06-12 11:45:18 u010377179 阅读数 1235
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10114 人正在学习 去看看 夏曹俊

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

    首先说明我的运行环境: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以内的……望知晓的大佬指点下

2016-02-17 16:34:01 woshispl 阅读数 75
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10114 人正在学习 去看看 夏曹俊
        //iphone 
        #if UNITY_IPHONE || UNITY_IOS || UNITY_IPHONE_API
        GLogger.LogWarning ("3333333333333333333333333333333333333333333LoadAssembly");
        Assembly[] array = System.AppDomain.CurrentDomain.GetAssemblies ();
        for (int i = 0; i < array.Length; i++) {
            if (array [i].FullName.IndexOf ("CoinRunner_dll") >= 0) {
                LocalResourceManager.assembly = array [i];
                GLogger.LogError (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IOS加载dll》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
                GLogger.LogError (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IOS加载dll》》》》》》" + array [i].GetType ().Name);
                break;
            }
        }
        #endif

//      System.Type[] types = LocalResourceManager.assembly.GetExportedTypes ();
//      for (int i = 0; i < types.Length; i++) {
//          GLogger.LogError (types [i].Name + "**************");
//      }
2017-03-25 21:27:18 brook0344 阅读数 905
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10114 人正在学习 去看看 夏曹俊

原因,在Plugins下,有一个

System.Windows.Forms.dll

这个文件不能在IOS里出现,

所以要再属性里设置select platforms for plugin,里面不要包括IOS平台

搞了三天竟然就是这个小问题,唉


2017-05-13 11:21:05 hylol 阅读数 818
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10114 人正在学习 去看看 夏曹俊
要使用GB("2312")编码,需从Unity安装目录(Editor\Data\Mono\lib\mono\unity 和 Editor\Data\Mono\lib\mono\2.0 两个目录中,拷贝I18N.DLLI18N.CJK.DLL到项目目录Asset文件夹下,PC测试可正常使用。但在unity5中要支持64位ios,就要选择IL2cpp模式,打包出来报错如下:

”NotSupportedException: CodePage "G2312" not supported”

而在mono2.x模式下打包正常运行。

原因是IL2cpp模式打包I18N.DLLI18N.CJK.DLL没有导入到xcode工程中,在xcode工程中搜索“I18N.DLL "、"I18N.CJK.DLL"没有结果。

解决方法:

将GB("2312") 改名为GB(936),两者是一样的。

在Assets根目录下添加link.xml文件,其内容如下:


<?xml version="1.0" encoding="utf-8"?>  
<linker>
  <assembly fullname="I18N"> <type fullname="I18N.Common.Manager" preserve="all"/>    
</assembly>  
  <assembly fullname="I18N.CJK">
 <type fullname="I18N.CJK.CP936" preserve="all"/>  
  </assembly>
 </linker>

打包后该编码能正常使用。

2015-12-18 16:26:29 wanzhanzhuce 阅读数 57
  • VC++动态链接库(dll)编程视频教学

    动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问dll中函数

    10114 人正在学习 去看看 夏曹俊
http://blog.csdn.net/yy405145590/article/details/41282669

主要思路是替换掉在mono里image.c的mono_image_open_from_data_with_name函数,HOOK掉加载DLL的地方,实现读取自定义的DLL文件。


检查发现在Xcode工程里的libiPhone-lib.a里存在mono的库文件,在libiPhone-lib.a下有两个CPU架构的库

[html] view plaincopy在CODE上查看代码片派生到我的代码片
lipo -info libiPhone-lib.a

Architectures in the fat file: libiPhone-lib.a are: armv7 i386

使用
[html] view plaincopy在CODE上查看代码片派生到我的代码片
lipo libiPhone-lib.a -thin armv7 -output libiPhone-lib.arm

解压出armv7的库文件
[html] view plaincopy在CODE上查看代码片派生到我的代码片
ar -t libiPhone-lib.arm
[html] view plaincopy在CODE上查看代码片派生到我的代码片
filterscpuimplvectordata.o
filterscpuimplwarp.o
filterscpumipmaps.o
filterscpupassvectordata.o
filterscpupvrtc.o
filterscpufxmapsbuffer.o
filterscpufxmapsmain.o
filterscpufxmapsdrawjob.o
filterscpufxmapsdrawqueue.o
filterscpufxmapsjob.o
filterscpufxmapspool.o
filterscpufxmapsthread.o
parsebitmap.o
parseblend.o
parseblur.o
parsechannelsshuffle.o
parsecommon.o
parsecontext.o
parsedata.o
parsedirectionalmotionblur.o
parsedirectionalwarp.o
parseemboss.o
parsefxmaps.o
parsefxmapssetcell.o
parsegradientmap.o
parsegrayscaleconversion.o
parsehsl.o
parselevels.o
parsemotionblur.o
parsenormal.o
parsesharpen.o
parsetransformation2d.o
parseuniformcolor.o
parsevectorgraphicsdata.o
parsewarp.o
apicontext.o
apihandle.o
apiversion.o
libCrashReporter-iphoneos.a-armv7-master.o

[html] view plaincopy在CODE上查看代码片派生到我的代码片
ar -t libiPhone-lib.arm | grep image.o
[html] view plaincopy在CODE上查看代码片派生到我的代码片
image.o
可以看到armv7下确实有image.o的模块


解压出image.o模块

[html] view plaincopy在CODE上查看代码片派生到我的代码片
ar -x libiPhone-lib.arm image.o
用十六进制工具搜索

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
mono_image_open_from_data_with_name 替换成 mono_image_open_from_data_with_xxxx

自己编译一个imagehook.c的文件生成imagehook.o,内容如下

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
#include <stdio.h>

extern int *
mono_image_open_from_data_with_xxxx(
char *data, unsigned int data_len,
int need_copy,
int *status,
int only, const char *name);


int *
mono_image_open_from_data_with_name(
char *data, unsigned int data_len,
int need_copy,
int *status,
int only, const char *name)
{
printf("call mono_image_open_from_data_with_name 0x%x 0x%x 0x%x 0x%x 0x%x %s", (int)data, (int)data_len, need_copy, (int)status, only, name);
return mono_image_open_from_data_with_xxxx(data, data_len, need_copy, status, only, name);
}

将image.o 和 imagehook.o重新打包进libiPhone-lib.arm
[html] view plaincopy在CODE上查看代码片派生到我的代码片
ar -r libiPhone-lib.arm image.o
ar -q libiPhone-lib.arm imagehook.o

重新生成libiPhone-lib.a
[html] view plaincopy在CODE上查看代码片派生到我的代码片
lipo libiPhone-lib.a -replace armv7 libiPhone-lib.arm -output libiPhone-lib.a_01

这样用新生成的libiPhone-lib.a去链接应用程序会发现调用到了我们自己的函数。

但是你会发现都是没用的,因为mono在IOS下是FULL AOT模式编译的,每个脚本dll会生成对应的.s汇编代码直接连接到可执行文件里面.

ios打包错误解决

阅读数 6192

OGRE运行期结构

阅读数 0

没有更多推荐了,返回首页