簡體   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