Как использовать C++ dll в Unity3D?
Я в курсе этот же вопрос, но он не отвечает на мою проблему.
Я написал два .dll
с помощью Visual Studio 2010 с. Один находится на C++ и взаимодействует с SDK, который был написан на C++. Другой-оболочка C# для этой библиотеки C++, чтобы ее можно было использовать в контекстах C#.
мой план состоял в том, что это позволит мне использовать мой код Unity3D
, но, по-видимому, это не так. Похоже на Unity3D
не позволяет импортировать .dll
s в качестве активов, если они не являются .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!
простой надзор, который может вызвать головную боль.