IL2CPP 스크립팅 백엔드를 사용하는 경우 C++(.cpp) 코드 파일을 Unity 프로젝트에 직접 추가할 수 있습니다. C++ 파일은 플러그인 인스펙터에서 플러그인의 역할을 합니다. C++ 파일을 macOS Player와 호환되도록 설정하면 Unity는 이 파일을 관리되는 어셈블리로부터 생성되는 C++ 코드와 함께 컴파일합니다. 인스펙터(Inspector) 창의 플랫폼 설정(Platform settings) 섹션에서 적절한 Mac OS 옵션을 선택할 수 있습니다.
함수들은 생성된 C++ 코드와 연결되어 있으므로 _P/Invoke
를 호출할 별도의 DLL 파일은 없습니다. 이런 이유로 DLL 이름 대신 "__Internal"
키워드를 사용할 수 있으며, 이 경우 다음 예제와 같이 런타임 시점에 함수를 로드하는 대신 C++ 링커가 함수를 확인하는 역할을 맡습니다.
[DllImport("__Internal")]
private static extern int
CountLettersInString([MarshalAs(UnmanagedType.LPWSTR)]string str);
다음과 같이 NativeFunctions.cpp에서 이러한 종류의 함수를 정의할 수 있습니다.
extern "C" __declspec(dllexport) int __stdcall CountLettersInString(wchar_t* str)
{
int length = 0;
while (*str++ != nullptr)
length++;
return length;
}
링커가 함수 호출을 확인하기 때문에 관리되는 런타임 시점에서 실행되는 C# 코드와 같이 관리되는 쪽의 함수 선언에 있는 모든 오류는 런타임 오류가 아니라 링커 오류를 생성합니다. 즉, 런타임 시점에 동적 로딩을 수행할 필요가 없으며, 함수가 C#에서 직접 호출됩니다. 따라서 P/Invoke
호출의 성능 소모가 크게 감소합니다.