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

7

Я работаю над проектом плагина 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.

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

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

Ваш Ответ

6   ответов
4

\ Best \ Plugins.

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

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

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

3

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

Я испробовал все эти решения часами ... оказалось, что моя внешняя DLL была 32-битной, а мой проект Unity был 64-битным. ПолучалDllNotFoundException так что меня повели по садовой дорожке ... еще одна вещь, на которую стоит обратить внимание.
Я получаю эти исключения, даже если я помещаю файл dll в директорию проекта и в ту же папку, что и exe-файл после сборки. Нужно ли распространять Visual C ++? Я собираю dll из Visual C ++ 2008 SP1 и устанавливаю все распространяемые Visual C ++ 2008, доступные на веб-сайте Microsoft, все еще получаю dll исключения, не найденную на другом компьютере.
@TrolleFar это сработало для меня, избавило меня от головной боли, спасибо, ребята, за размещение вопроса, ответов и комментариев!
Лучшее место для DLL-файлов было бы в папке проекта. Просто поместите dll-файлы в ту же папку, где находится & quot; Активы & quot; и & quot; Библиотека & quot; папки.
Перепробовал все, ничего не получалось. Пожалуйста помогиstackoverflow.com/questions/54898629/…
6

Благодаря этомуСообщение на форуме 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-директория (куда они автоматически копируются при сборке).

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

Здравствуйте, не могли бы вы помочь мне с этим -stackoverflow.com/questions/54898629/…
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")]

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

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

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

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

Похожие вопросы