Unity3D插件中的DllNotFoundException for c++ dll




unity c++ plugin (5)

我正在Unity插件項目工作,並嘗試從C#文件導入C ++本機DLL。 但我不斷得到dllnotfoundexception。

c ++的dll代碼:

extern "C" {
extern __declspec( dllexport ) bool IGP_IsActivated();
}

c#代碼:

[DllImport("mydll")]
    private static extern bool IGP_IsActivated();

Dll到位,FIle.Exists正常工作。 所有依賴的DLL都存在於相同的層次結構中,但我仍然以dllnotfound異常結束。

任何幫助,非常感謝!


Answer #1

只需把DLL插件下的插件文件夾,並為我工作


Answer #2

感謝這個Unity論壇帖子,我想出了一個很好的解決方案,它在運行時修改了PATH環境變量:

  • Project\Assets\Wherever\Works\Best\Plugins放入所有 DLL(包括Unity接口的DLL以及它們相關的DLL)。
  • 將下面的靜態構造函數放入使用插件的類中:

    static MyClassWhichUsesPlugin() // static Constructor
    {
        var currentPath = Environment.GetEnvironmentVariable("PATH",
            EnvironmentVariableTarget.Process);
    #if UNITY_EDITOR_32
        var dllPath = Application.dataPath
            + Path.DirectorySeparatorChar + "SomePath"
            + Path.DirectorySeparatorChar + "Plugins"
            + Path.DirectorySeparatorChar + "x86";
    #elif UNITY_EDITOR_64
        var dllPath = Application.dataPath
            + Path.DirectorySeparatorChar + "SomePath"
            + Path.DirectorySeparatorChar + "Plugins"
            + Path.DirectorySeparatorChar + "x86_64";
    #else // Player
        var dllPath = Application.dataPath
            + Path.DirectorySeparatorChar + "Plugins";
    
    #endif
        if (currentPath != null && currentPath.Contains(dllPath) == false)
            Environment.SetEnvironmentVariable("PATH", currentPath + Path.PathSeparator
                + dllPath, EnvironmentVariableTarget.Process);
    }
    
  • [InitializeOnLoad]添加到類,以確保在編輯器啟動時運行構造函數:

     [InitializeOnLoad]
     public class MyClassWhichUsesPlugin
     {
         ...
         static MyClassWhichUsesPlugin() // static Constructor
         {
             ...
         }
      }
    

有了這個腳本,就不需要復制DLL。 Unity編輯器在Assets/.../Plugins/... -folder中找到它們,並且可執行文件在..._Data/Plugins找到它們(在構建時會自動複製它們)。


Answer #3
  • 插件應該都保留在一個名為插件的文件夾中。
  • 你的dll構建的體系結構(x86或x86_64)必須與Unity編輯器的體系結構版本相對應。 Unity Editor 32位不會加載64位插件,反之亦然。
  • 如果你的目標是32位和64位體系結構,你應該把你的dll放在Plugins文件夾內的特殊文件夾中。 名稱是32位dll的Plugins / x86和64位dll的Plugins / x86_64(x64也可以)。
  • Visual C ++可再發行組件必須安裝。 我從2008年開始。
  • 當你建立你所有的dll應該被複製到你的可執行文件的同一個路徑(並且為了正確的x86 / x64架構而構建)

這些線程有點過時,但仍然相關

DLLNotFoundException - Unity3D插件

統一內部編譯器錯誤與自定義DLL


Answer #4

我花了一天這個錯誤。 我的問題是,Android沒有得到庫,總是得到和DDLNotFound錯誤。 我的解決方案是:

1.-確保在Plugins文件夾中有合適的架構庫。

插件/安卓/ x86和插件/安卓/ armeabi - v7a如果你的建設設置是FAT(x86和ARM)

2.檢查Unity是否將它們識別為庫。 如果您在“項目”選項卡中選擇它們,則應將其視為庫以及相關的平台和體系結構。

3.-建立之後(不要關閉Unity Editor!),你可以在Temp / StagingArea / libs中檢查你的庫是否在那裡。 如果有確定的圖書館將在APK中。 作為一個雙重檢查,您可以打開您的APK(更改為zip擴展名)並查看lib文件夾中的庫。

4.-在C#中,您應該刪除庫名中的任何lib前綴,例如:

如果你的庫名稱是“libdosomething.so”,你應該把它叫做

[DllImport(“dosomething”)]

我希望為你工作:)

乾杯。


Answer #5

將DLL(s)Unity接口放在Project \ Assets \ Where \ Works \ Best \ Plugins中。

在Project中放置任何不直接由您的腳本訪問的依賴項DLL。 這將允許您的程序在編輯器中運行。

在構建時,再次將依賴項DLL文件複製到構建目錄的根目錄(就在生成的可執行文件的旁邊)。 這應該允許您的應用程序在運行時加載它們。

(提示:您可以使用Dependency Walker查看您的DLL並查看它們依賴於的內容。)