繁体   English   中英

从C#调用纯C函数时,首先是DllNotFoundException然后是EntryPointNotFoundException

[英]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

这就是我的想法:

  1. 因为Xcode非常聪明,我猜测在添加简单的test.c文件时,Xcode为我修改了一些我的包设置。 我相信这就是为什么DllNotFoundException首先消失的原因。 我在想吗?
  2. 我想要解决EntryPointNotFound问题我还要修改一些捆绑项目设置 - 但我不知道怎么...请帮帮我...

很多和很多的感谢!

编辑

  1. 我看到这个帖子暗示,由于Xcode使用g ++进行编译,即使我的非托管代码是纯C,我也需要extern“C”。我在Xcode4中更改了我的目标设置“ Compiler for C / C ++ / Objective-C ”从Apple LLVM 3.0LLVM GCC 4.2 ,但我仍然得到相同的例外。
  2. 我还看到这个单声道文档说单声道使用GLib加载库,而Glib在Mac OS X上有一个错误,它无法识别.dylib库。 我删除了.dylib库并再次尝试,但直到得到相同的异常。
  3. 此外, Apple的文档说每个可加载的包必须有一个主类,如果用户没有指定哪个类是主类,NSBundle将使用Xcode项目中显示的第一个类作为主类。 好吧,我想我创建的包是一个可加载的包,但因为它只是一个用C构建的静态库,所以它实际上没有任何类。 当我查看我的项目的info.plist时Principal Class条目只是空的。 这可能是问题吗? 如果是这样,我该如何解决?
  4. 另外我在Apple的文档中看到了一些我不太明白的东西:

    如果可加载包是一个插件,则主机应用程序开发人员通常在框架中为插件体系结构提供接口。 此框架通常包含所有插件主体类继承的类,或者插件的主体类要采用的协议(正式或非正式)。

    我很确定我创建的可加载包是一个插件。 我正在将捆绑包导入Unity3D。 这是否意味着我应该从Unity定义一个主要类? 怎么样?

问题有一个简单的解决方案:

尝试先在test.c文件中为您提供EntryPointNotFoundException的任何函数。

通过“试用”我的意思是,在main()中调用函数并首先在C中测试它。

在我的例子中,抛出EntryPointNotFoundException的函数称为ccn_run()。 所以我做了以下事情:

  1. 在test.c中添加一个main()函数
  2. 在main()函数中键入ccn_run()
  3. 在Xcode项目中添加一个命令行目标并测试它

我试了一下,函数在C中工作正常,现在神奇的是当我重建bundle时(不删除main()函数和ccn_run()调用),Unity可以调用ccn_run()函数没有问题!

我无法解释为什么这可以解决我的问题,但这已经为我工作了近一个月了。 不久前Xcode升级到4.3.2并且我再次尝试了相同的方法,仍然有效。 我想也许添加一个main()函数有助于定义入口点?

最后,我记录了将C代码导入Unity的整个过程,我很高兴在此分享: https//docs.google.com/document/d/1vAeupNQlBTY3y3Bma5Jo_Hs4JRYm6FoEc4vQN0WBGNg/edit

我的代码示例:

  1. Xcode项目: https//github.com/CherryQu921/CCNxPlugin
  2. Unity项目: https//github.com/CherryQu921/cqs

希望这个答案特别是我的教程帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM