2012-04-03 2 views
7

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

C++ код DLL:

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

C# код:

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

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

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

+0

- это плагин, доступный где-то? – Alex

ответ

3

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

+4

Лучшее место для файлов dll будет в папке проекта. Просто поместите файлы DLL в ту же папку, что и папки «Активы» и «Библиотека». – TrolleFar

+0

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

+2

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

4

Поместите DLL (ы) в Unity с интерфейсом Project \ Assets \ Wherever \ Works \ Best \ Plugins.

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

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

(Совет. Вы можете использовать Dependency Walker посмотреть на вас библиотек DLL и посмотреть, что они зависят от)

0

просто поместить библиотеки DLL в папке плагинов и что работает для меня

5

Благодаря этому Unity forum post я придумал с хорошим решением, которое изменяет переменную PATH Окружающей среду во время выполнения:

  • Помещенного всех библиотеки DLL (как DLL, которые интерфейсы Unity с и их зависимые библиотеками DLL) в Project\Assets\Wherever\Works\Best\Plugins.
  • Поместите следующий статический конструктор в класс, который использует плагин:

    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] в класс, чтобы убедиться, что конструктор run at editor launch:

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

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

1
  • Плагины должны находиться в папке под названием «Плагины».
  • Архитектура вашей dll построена для (x86 или x86_64), должна соответствовать архитектурной версии Unity Editor. Unity Editor 32-бит не будет загружать 64-битные плагины и наоборот.
  • Если вы ориентируетесь на 32-разрядную и 64-разрядную архитектуры, вы должны поместить свои DLL в специальные именованные папки внутри папки «Плагины». Именами являются плагины/x86 для 32-разрядных библиотек DLL и плагинов/x86_64 (x64 также работает) для 64-разрядных библиотек DLL.
  • Необходимо распространять распространенные компоненты Visual C++. У меня есть все от 2008
  • Когда вы строите все библиотеки DLL должны быть скопированы в тот же путь исполняемого файла (и снова построен для правильной x86/x64 архитектуры)

Эти нити немного устарели, но до сих пор соответствующего

DLLNotFoundException - Unity3D Plugin

Unity internal compiler error with custom dll

1

Я провел один день с этой ошибкой. Моя проблема заключалась в том, что Android не получает библиотеку и всегда получает ошибку DDLNotFound. Мое решение было:

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

Plugins/Android/x86 и Plugins/Android/armeabi-v7a Если параметры сборки FAT (x86 & рука)

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

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

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

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

[DllImport (» DoSomething ")]

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

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

Смежные вопросы