Как использовать C++ dll в Unity3D?

Я в курсе этот же вопрос, но он не отвечает на мою проблему.

Я написал два .dllс помощью Visual Studio 2010 с. Один находится на C++ и взаимодействует с SDK, который был написан на C++. Другой-оболочка C# для этой библиотеки C++, чтобы ее можно было использовать в контекстах C#.

мой план состоял в том, что это позволит мне использовать мой код Unity3D, но, по-видимому, это не так. Похоже на Unity3D не позволяет импортировать .dlls в качестве активов, если они не являются .NET сборка. Поэтому я могу добавить свою оболочку C#, но не dll c++.

в результате DllNotFoundException всякий раз, когда я пытаюсь получить доступ к библиотеке C++. Я попытался просто скопировать библиотеку C++ в , но это дает те же результаты.

есть ли способ сделать это правильно? Это очень важная часть моего проекта.

2 ответов


проблема в том, что DLL не найдена, когда P / invoke runtime code вызывает LoadLibrary(YourNativeDllName).

вы можете решить эту проблему, убедившись, что ваша DLL находится на пути поиска DLL в точке, где выполняется первый вызов p/invoke. Например, вызывая SetDllDirectory.

решение, которое я лично предпочитаю, заключается в том, чтобы ваш управляемый код вызывал вызов LoadLibrary передача полного абсолютного пути к собственной DLL. Таким образом, когда последующий п/вызвать индуцированное вызов LoadLibrary(YourNativeDllName) это make, ваша собственная DLL уже находится в процессе и поэтому будет использоваться.

internal static class NativeMethods
{
    [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
    internal static extern IntPtr LoadLibrary(
        string lpFileName
    );
}

а затем где-то в вашем коде:

private static IntPtr lib;

....

public static void LoadNativeDll(string FileName)
{
    if (lib != IntPtr.Zero)
    {
        return;
    }

    lib = NativeMethods.LoadLibrary(FileName);
    if (lib == IntPtr.Zero)
    {
        throw new Win32Exception();
    }
}

просто убедитесь, что вы называете LoadNativeDll передача полного пути к родной библиотеке, прежде чем вызывать любой из p/вызывает эту родную библиотеку.


обратите внимание, что исключение DllNotFoundException может быть вызвано созданием библиотеки DLL Unity в Debug вместо Release!

простой надзор, который может вызвать головную боль.