Version: 2019.3
유니버설 Windows 플랫폼: IL2CPP 스크립팅 백엔드로 생성된 프로젝트
유니버설 Windows 플랫폼: IL2CPP 스크립팅 백엔드에서 디버깅

유니버설 Windows 플랫폼: IL2CPP 스크립팅 백엔드상의 플러그인

유니버설 Windows 플랫폼용 플러그인 모델은 Windows 스탠드얼론과 같은 다른 Unity 플랫폼과 유사합니다.

관리되는 플러그인

기본적으로, IL2CPP는 .NET 2.0 API 호환성 레벨을 타겟팅합니다. 이는 .NET 4.5를 타겟팅하거나 Windows 런타임 API를 소모하는 관리되는 플러그인을 지원하지 않습니다. 모든 관리된 플러그인은 이 호환성 레벨을 사용하려면 .NET 4.5나 동등한 API를 타겟팅해야 합니다. 추후 이 제약을 해제하고 싶으면 Player 설정에서 .NET 4.6 API 호환성 레벨로 변경할 수 있습니다.

IL2CPP 스크립팅 백엔드는 Unity 에디터나 스탠드얼론 플레이어와 동일한 .NET API 표면을 노출합니다. 따라서 다른 유니버설 Windows 플랫폼용 .NET API를 타겟팅하여 다수의 버전으로 컴파일할 필요 없이 동일한 플러그인을 사용할 수 있습니다.

네이티브 플러그인

IL2CPP 스크립팅 백엔드는 플랫폼 호출 메커니즘을 통해 네이티브 플러그인 사용을 지원합니다. 따라서 네이티브 함수 프로토타입을 지정한 후 이를 호출하는 방법으로 네이티브 플러그인을 직접 C# 코드에서 호출할 수 있습니다. 아래의 예제를 참조하십시오.

[DllImport("MyPlugin.dll")]
private static extern int CountLettersInString([MarshalAs(UnmanagedType.LPWSTR)]string str);

private void Start()
{
    Debug.Log(CountLettersInString("Hello, native plugin!"));
}

MyPlugin.dll에서 이러한 함수의 구현은 아래와 같이 이루어집니다.

extern "C" __declspec(dllexport)
int __stdcall CountLettersInString(wchar_t* str)
{
    int length = 0;
    while (*str++ != nullptr)
        length++;
    return length;
}

플랫폼 호출 마셜링 규칙은 공식 .NET 마셜링 규칙과 동일합니다만, 아래와 같이 몇몇 지원되지 않는 타입이 있습니다.

  • AnsiBStr
  • Currency
  • SAFEARRAY
  • IDispatch
  • TBStr
  • VBByRefStr

x86에서 플랫폼 호출을 위한 기본 호출 방법은 __stdcall입니다.

네이티브 플러그인은 미리 컴파일된 DLL이나 C++ 소스 코드를 통해 작성할 수 있습니다.

미리 컴파일된 네이티브 플러그인

미리 컴파일된 네이티브 플러그인에 플랫폼 호출을 하는 과정은 런타임 중 DLL를 로드하고, 함수 입력 지점을 검색한 후 호출하는 방법으로 이루어집니다. 이들 DLL 파일은 타겟 CPU 아키텍처에 대한 올바른 Windows SDK에 대해 컴파일되어야 합니다. 또한 Unity 프로젝트에 추가되는 경우 플러그인 인스펙터에서 설정해야 합니다.

C++ 소스 코드 네이티브 플러그인

C++ (.cpp) 코드 파일을 직접 Unity 프로젝트에 추가할 수 있으며, 이 경우 코드 파일은 플러그인 인스펙터에서 플러그인으로 작동합니다. 유니버설 Windows 플랫폼과 IL2CPP 스크립팅 백엔드에 호환되도록 설정된 경우, 이들 C++ 파일은 아래와 같이 관리되는 어셈블리에서 생성되는 C++ 코드와 같이 컴파일됩니다.

함수들은 생성된 C++ 코드와 연결되어 있으므로 플랫폼 호출을 진행할 별도의 DLL 파일은 없습니다. 이런 이유로 DLL 이름 대신 “__Internal” 키보드를 사용할 수 있으며, 이 경우 아래와 같이 런타임 시점에 함수를 로드하는 대신 C++ 링커가 함수를 해결하는 책임을 집니다.

[DllImport("__Internal")]
private static extern int CountLettersInString([MarshalAs(UnmanagedType.LPWSTR)]string str);

호출은 링커에 의해 해결되므로, 관리된 부분의 함수 선언에서 오류가 발생하면 런타임 오류가 아닌 링커 오류가 발생합니다. 또한 런타임 중에 동적 로딩이 발생하지 않으며, 함수가 직접 호출됩니다. 이로 인하여 플랫폼 호출의 부하가 상당히 줄어들게 됩니다.

플랫폼 호출 제한

유니버설 Windows 플랫폼에서는 IL2CPP 스크립팅 백엔드를 사용하는 경우 dll 이름을 지정하는 방법으로 특정 시스템에 플랫폼 호출을 할 수 없습니다. (“kernelbase.dll” 등) 프로젝트 외부의 DLL에 플랫폼 호출을 시도하는 경우 런타임 시점에 DllNotFoundException이 발생합니다.

하지만 DLL 이름 대신 “Internal” 키워드를 지정하여 시스템 함수에 대해 플랫폼 호출을 할 수 있습니다. 이렇게 되면 빌드 타임 동안 링커가 함수를 해결하게 됩니다.

참고 항목

플러그인 인스펙터


  • • 2018–08–03 페이지 수정됨
  • 2018.3에서 NET 3.5 스크립팅 런타임의 지원이 중단됨
유니버설 Windows 플랫폼: IL2CPP 스크립팅 백엔드로 생성된 프로젝트
유니버설 Windows 플랫폼: IL2CPP 스크립팅 백엔드에서 디버깅