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

时间:2012-04-03 07:57:52

标签: xcode unity3d dllnotfoundexception entrypointnotfoundexcept

我正在尝试在Unity3D pro中使用一些C代码。

我的基本方法是(1)将C源代码构建到静态库中(2)创建一个空包并链接到库(3)将包导入Unity 3D pro(作为插件)。

我基本上跟随this tutorial

直到最近,当我更新我的C代码并重新编译和重建库和捆绑包时,它一直在为我工作一段时间......一切都出错了......

当我第一次导入捆绑包时,我得到了 DllNotFoundException

在那个阶段,我的捆绑项目只是一堆库 - 从我的源代码(一个.a文件)构建的库和我认为.a库所依赖的一些其他库(其他库有.dylib扩展名。)

我在捆绑包中添加了一个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问题我还要修改一些捆绑项目设置 - 但我不知道怎么样......请帮帮我......
  3. 很多和很多谢谢!

    修改

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

        

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

  1. 将一个main()函数添加到test.c
  2. 在main()函数中输入ccn_run()
  3. 在Xcode项目中添加命令行目标并测试它
  4. 我试了一下,功能在C中运行正常,现在神奇的是当我重建捆绑包(没有删除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
    3. 希望这个答案特别是我的教程有帮助!