[英]First DllNotFoundException then EntryPointNotFoundException while calling pure C function from C#
我想在Unity3D pro中使用一些C代码。
我的基本方法是(1)将C源代码构建到静态库中(2)创建一个空包并链接到库(3)将包导入Unity 3D pro(作为插件)。
我基本上是按照本教程 。
它一直在为我工作一段时间,直到最近我更新我的C代码并重新编译和重建库和捆绑包,一切都出错了......
当我第一次导入捆绑包时,我得到了一个DllNotFoundException 。
在那个阶段,我的bundle项目只是一堆库 - 从我的源代码(一个.a文件)构建的库和我认为.a库所依赖的一些其他库(其他库具有.dylib扩展名) )。
我在bundle中添加了一个test.c文件。 测试.c文件只包含两行:
#include <stdio.h>
#include "ccn.h"
char* say()
{
return "hi";
}
其中ccn.h是我的C源代码中的头文件。
在我重新构建捆绑包之后, DllNotFoundExeption消失了,但我得到了一个EntryPointNotFoundException 。
很多和很多的感谢!
另外我在Apple的文档中看到了一些我不太明白的东西:
如果可加载包是一个插件,则主机应用程序开发人员通常在框架中为插件体系结构提供接口。 此框架通常包含所有插件主体类继承的类,或者插件的主体类要采用的协议(正式或非正式)。
我很确定我创建的可加载包是一个插件。 我正在将捆绑包导入Unity3D。 这是否意味着我应该从Unity定义一个主要类? 怎么样?
问题有一个简单的解决方案:
尝试先在test.c文件中为您提供EntryPointNotFoundException的任何函数。
通过“试用”我的意思是,在main()中调用函数并首先在C中测试它。
在我的例子中,抛出EntryPointNotFoundException的函数称为ccn_run()。 所以我做了以下事情:
我试了一下,函数在C中工作正常,现在神奇的是当我重建bundle时(不删除main()函数和ccn_run()调用),Unity可以调用ccn_run()函数没有问题!
我无法解释为什么这可以解决我的问题,但这已经为我工作了近一个月了。 不久前Xcode升级到4.3.2并且我再次尝试了相同的方法,仍然有效。 我想也许添加一个main()函数有助于定义入口点?
最后,我记录了将C代码导入Unity的整个过程,我很高兴在此分享: https : //docs.google.com/document/d/1vAeupNQlBTY3y3Bma5Jo_Hs4JRYm6FoEc4vQN0WBGNg/edit
我的代码示例:
希望这个答案特别是我的教程帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.