2013-04-10 3 views
6

나는 this similar question을 알고 있지만 내 문제에는 반응이 없습니다.Unity3D에서 C++ dll을 사용하는 방법은 무엇입니까?

Visual Studio 2010을 사용하여 .dll 두 개를 작성했습니다. 하나는 C++로 작성되었으며 C++로 작성된 SDK와 통신합니다. 다른 하나는 C# 라이브러리에 대한 C# 래퍼이므로 C# 컨텍스트에서 사용할 수 있습니다.

제 계획은이 코드를 사용하여 Unity3D에 코드를 사용하게하는 것이지만 분명히 사실이 아닙니다. .NET 어셈블리가 아닌 경우 처럼 자산으로 .dll을 가져올 수 없습니다. 그래서 C# 래퍼를 추가 할 수 있지만 C++ dll은 추가 할 수 없습니다.

이 결과는 C++ 라이브러리에 액세스하려고 할 때마다 DllNotFoundException이됩니다. C 라이브러리를 단순히 Assets/Plugins 폴더에 복사하려고 시도했지만 동일한 결과가 나타납니다.

제대로 수행 할 수있는 방법이 있습니까? 이것은 내 프로젝트 설정에서 매우 중요한 부분입니다.

+0

어떻게 C++ DLL을 호출합니까? 참조로 솔루션에 추가 할 필요는 없습니다. 네이티브 리소스입니다. –

+0

@SimonWhitehead'[DllImport ("Foo.dll")]'과 함께 C++ 함수를 호출하기 위해'PInvoke'를 사용합니다. 두 dll이 같은 폴더에있을 때 작동하지만 Unity가 dll 플러그인을 처리하는 방법을 알지 못합니다. –

+0

어떤 라이센스를 사용하고 있습니까? 당신의 목표는 무엇입니까? – aukaost

답변

5

문제는 p/invoke 런타임 코드가 LoadLibrary(YourNativeDllName) 일 때 DLL이 발견되지 않는다는 것입니다.

DLL이 첫 번째 p/invoke 호출이 이루어진 지점에서 DLL 검색 경로에 있는지 확인하여이 문제를 해결할 수 있습니다. 예를 들어 SetDllDirectory을 호출하여

개인적으로 선호하는 솔루션은 관리되는 코드가 LoadLibrary에 대한 호출을 호출하여 네이티브 DLL에 대한 전체 절대 경로를 전달하는 것입니다. 그런 다음 p/invoke가 LoadLibrary(YourNativeDllName)에 대한 호출을 유도 할 때 네이티브 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(); 
    } 
} 

그냥 네이티브 라이브러리를 호출하면 P /의를 호출하기 전에, 네이티브 라이브러리의 전체 경로를 통과 LoadNativeDll 전화 있는지 확인 .

+0

정말 라이브러리의 절대 경로를 사용해야합니까? 나는이 프로젝트에서 일하는 유일한 사람이 아니기 때문에 상황이 매우 복잡해 질 것입니다 ... –

+0

그래. 그러나 이것이 당신이 경로를 하드 코딩해야한다는 것을 의미하지는 않습니다. 런타임에 빌드 할 수 있습니다. 네이티브 DLL을 같은 폴더와 관리되는 DLL에 넣고 그런 식으로 경로를 만듭니다. p/invoke 선언은 여전히 ​​DLL 이름, 즉 ""mydll.dll "'만을 사용합니다. 그러나 시스템이 DLL을 어떻게 든 찾아야한다는 사실에서 벗어나는 것은 없습니다. 당신은 어디서든 당신이 공상 할 수있는 DLL을 놓을 수는 없으며 시스템이 당신을 위해 그것을 찾길 희망한다. –

+0

나는 어디서든 무작위로 배치 할 수 없다는 것을 안다; Unity3D가 C#에 어떻게 접근하는지와 비슷한 방식으로 접근 할 수 있도록 어떻게 든 종속성으로 지정하도록 기대하고있었습니다.런타임에 경로를 구축 할 수 있다고 말하면 어떻게 그 경로를 제안합니까? Unity3D는 플러그인으로 가져온 후에는 내 dll을 움직여서 어떻게 할 수 있는지 잘 모르겠습니다. –

0

릴리스 DLL 대신 디버그에서 Unity DLL을 빌드하면 DllNotFoundException이 발생할 수 있습니다.

두통을 유발할 수있는 간단한 감시.

관련 문제