Unity 5.5.6f1 - собственный плагин не работает, ошибка DllNotFoundException - PullRequest
0 голосов
/ 25 апреля 2018

Я пишу плагин Unity на C #, который использует SQLite.

Зависимость SQLite от SQLite.Interop.dll, так как я понимаю, что это неуправляемая DLL.

Когда я экспортирую мои плагины Unity, вместе с моим плагином экспортировалось несколько DLL-файлов.

Bin folder
|
|_ MyPlugin.dll
|_ System.Data.SQLite.dll
|_ (other files)
|_ x86
|   |_ SQLite.Interop.dll
|
|_ x64
|   |_ SQLite.Interop.dll

При использовании в игровом проекте Unity все файлы я помещаю в Assets / Plugins / MyPlugin, как показано ниже:

Assets
|
|_ Plugins
    |_ MyPlugin
         |_ MyPlugin.dll
         |_ System.Data.SQLite.dll
         |_ (other files)
         |_ SQLite.Interop.dll (x64 version)

В редакторе Unity все в порядке, я могу установить соединение с SQLite и выполнить транзакцию.

Однако при экспорте проекта Unity в автономное приложение для Windows x64 он не работает и выдает ошибку, сообщающую, что DllNotFoundException.

System.DllNotFoundException: SQLite.Interop.dll
at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods:sqlite3_config_none (System.Data.SQLite.SQLiteConfigOpsEnum)
  at System.Data.SQLite.SQLite3.StaticIsInitialized () [0x00000] in <filename unknown>:0 
  at System.Data.SQLite.SQLiteLog.Initialize () [0x00000] in <filename unknown>:0 
  at System.Data.SQLite.SQLiteConnection..ctor (System.String connectionString, Boolean parseViaFramework) [0x00000] in <filename unknown>:0 
  at System.Data.SQLite.SQLiteConnection..ctor (System.String connectionString) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Data.SQLite.SQLiteConnection:.ctor (string)
  at MyPlugin.Service.Util.SqliteBase.InitConnection () [0x00000] in <filename unknown>:0 
  at MyPlugin.Service.Util.SqliteBase.OpenConnection () [0x00000] in <filename unknown>:0

Структура папок автономного приложения выглядит следующим образом:

Output
|_ UnityApp.exe
|_ UnityApp_Data
    |
    |_ Managed
    |    |_ MyPlugin.dll
    |    |_ System.Data.SQLite.dll
    |    |_ (other DLLs)
    | 
    |_ Plugins
         |_ SQLite.Intedrop.dll

DLL есть, но кажется, что Unity ее не находит.

Я нашел решение для изменения переменной среды PATH здесь https://stackoverflow.com/a/33124250

Это работает, но мне интересно, если что-то не так с моей конфигурацией или есть какая-то причина, почему Unity не загружает SQLite.Intedrop.dll, хотя он существует в папке данных приложения.

Я очень ценю любую помощь.

РЕДАКТИРОВАТЬ 1: DLL-библиотека SQLite получает NUGET:

<package id="System.Data.SQLite" version="1.0.106.0" targetFramework="net35" />
<package id="System.Data.SQLite.Core" version="1.0.106.0" targetFramework="net35" />
<package id="System.Data.SQLite.Linq" version="1.0.106.0" targetFramework="net35" />

1 Ответ

0 голосов
/ 25 апреля 2018

Вы поместили родной плагин в неправильные папки.

Поместите 32-битный плагин dll в Assets/Plugins/x86.

Поместите 64-битный плагин dll в Assets/Plugins/x86_64.

Убедитесь, что вы также включили все зависимости, иначе вы все равно увидите ту же ошибку.

...