7

Вопрос по unity3d – DllNotFoundException в плагине unity3d для c ++ dll

Я работаю над проектом плагина Unity и пытаюсь импортировать нативную dll c ++ из файла c #. Но я продолжаю получать исключение.

c++ dll code:

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

c# code:

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

Dll на месте и FIle.Exists работают должным образом. Все зависимые dll присутствуют в одной и той же иерархии, но я все же в конечном итоге в исключении dllnotfound.

Любая помощь, высоко ценится!

  • Я получаю эти исключения, даже если я помещаю файл dll в директорию проекта и в ту же папку, что и exe-файл после сборки. Нужно ли распространять Visual C ++? Я собираю dll из Visual C ++ 2008 SP1 и устанавливаю все распространяемые Visual C ++ 2008, доступные на веб-сайте Microsoft, все еще получаю dll исключения, не найденную на другом компьютере.

    от
  • Это помогло мне. Я использую Unity 2018.3, и теперь правильная архитектура - это плагины / Android_x86 и плагины / Android_armeabi-v7a. Я также поместил библиотеку в Plugins / Android_arm64-v8a, но пока Unity распознает ее как arm64, она не используется .. Android_x86_64 не поддерживается

    от
  • Я не смог заставить работать статическое устройство в Unity 2017.3.1f1. Во время выполнения я получил: «UnityException: get_dataPath нельзя вызывать из конструктора MonoBehaviour (или инициализатора поля экземпляра), вместо этого вызывайте его в Awake или Start». & Quot; Я переключил его на использование Awake (), и он работал нормально & amp; редактор & amp; в моей сборке.

    от
  • Я испробовал все эти решения часами ... оказалось, что моя внешняя DLL была 32-битной, а мой проект Unity был 64-битным. ПолучалDllNotFoundException так что меня повели по садовой дорожке ... еще одна вещь, на которую стоит обратить внимание.

    от
  • Здравствуйте, не могли бы вы помочь мне с этим -stackoverflow.com/questions/54898629/…

    от
  • Перепробовал все, ничего не получалось. Пожалуйста помогиstackoverflow.com/questions/54898629/…

    от
  • @TrolleFar это сработало для меня, избавило меня от головной боли, спасибо, ребята, за размещение вопроса, ответов и комментариев!

    от
  • Лучшее место для DLL-файлов было бы в папке проекта. Просто поместите dll-файлы в ту же папку, где находится & quot; Активы & quot; и & quot; Библиотека & quot; папки.

    от
  • плагин доступен где-нибудь?

    от Alex
6 ответов
  • 0

    просто поместите dll в папку плагинов, и это работает для меня

  • 6

    Благодаря этому Put .

    Благодаря этомуСообщение на форуме Unity Я придумал хорошее решение, которое модифицируетPATHпеременная окружения во время выполнения:

    Put all DLLs (both the DLLs which Unity interfaces with and their dependent DLLs) in Project\Assets\Wherever\Works\Best\Plugins.

    Put the following static constructor into a class which uses the plugin:

    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);
    }
    

    Add [InitializeOnLoad] to the class to make sure that the constructor is run at editor launch:

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

    С этим сценарием нет необходимости копировать вокруг DLL. Редактор Unity находит их вAssets/.../Plugins/...папка и исполняемый файл находит их в..._Data/Plugins-директория (куда они автоматически копируются при сборке).

  • 3

    Ну, я получил это работает.

    Для тех, кто может столкнуться с этой проблемой, если у вас есть несколько dll, вам нужно поместить вторичные dll на корневой уровень редактора Unity (например, C: \ Program Files \ Unity \ Editor) и фактическую указанную dll из скрипта в папка плагинов. Это сработало для меня.

  • 1

    Убедитесь, что следующий список проверок удовлетворен:

    Plugins should all stay in a folder called Plugins. The architecture your dll is built for (x86 or x86_64) must correspond to the architecture version of Unity Editor. Unity Editor 32-bit will not load 64 bit plugins and viceversa. If you are targeting both 32 and 64 bit architectures you should put your dlls in special named folders inside the Plugins folder. The names are Plugins/x86 for 32 bit dlls and Plugins/x86_64 (x64 also works) for 64 bit dlls. Visual C++ Redistributables must be installed. I have all from 2008. When you build all your dlls should be copied into the root where your executable is (and again built for the correct x86/x64 architecture)

    Если вы продолжаете получать ошибку пространства имен, это означает, что dll, который вы импортируете, имеет неуправляемый код, и он должен быть обернут в другой управляемый dll-плагин для работы.

    Эти темы немного устарели, но все еще актуальны

    DLLNotFoundException - Плагин Unity3D

    Внутренняя ошибка компилятора Unity с пользовательской DLL

  • 4

    Поместите библиотеки DLL с Unity в Project \ Assets \ Wherever \ Works

    \ Best \ Plugins.

    Поместите все библиотеки зависимостей, к которым у вас нет прямого доступа к вашим сценариям, в Project. Это позволит вашей программе работать в редакторе.

    При сборке снова скопируйте DLL-файлы зависимостей, на этот раз в корень каталога сборки (рядом с созданным исполняемым файлом). Это должно позволить вашему приложению загружать их во время выполнения.

    (Совет: вы можете использоватьЗависимость Уокер посмотрите на свои DLL и посмотрите, от чего они зависят.)

  • 2

    Я провел один день с этой ошибкой. Моя проблема заключалась в том

    что Android не получает библиотеку и всегда получает ошибку DDLNotFound. Мое решение было:

    1. Убедитесь, что у вас есть библиотеки для правильной архитектуры в папке плагинов.

    Плагины / Android / x86 и Плагины / Android / armeabi-v7a, если ваши настройки сборки FAT (x86 & amp; arm)

    2.- Убедитесь, что Unity распознает их как библиотеки. Если вы выберете их на вкладке «Проект», вы должны увидеть их как библиотеку и связанную с платформой и архитектурой.

    3.- После сборки (не закрывайте Unity Editor!) Вы можете проверить в Temp / StagingArea / libs, есть ли там ваши библиотеки. Если они есть, библиотеки будут в APK. В качестве двойной проверки вы можете открыть свой APK (сменить расширение на zip) и просмотреть библиотеки в папке lib.

    4.- В C # вы должны удалить любой префикс lib в названии вашей библиотеки, например:

    Если ваша библиотека называется «libdosomething.so» ты должен назвать это как

    [DllImport ("dosomething")]

    Я надеюсь, что эта работа для вас :)

    Приветствия.