본문으로 건너뛰기

IL2CPP

UNInject는 에디터/모노에서 돌아가는 리플렉션·Expression 경로와,
Roslyn이 만들면 대리(delegate)·팩토리만 쓰는 경로가 갈립니다.

정보

IL2CPP(AOT) 에서는 후자가 훨씬 안전합니다.


왜 Roslyn 플랜이 유리한가

  • 필드 주입: 생성 플랜이 있으면 TypeDataCacheCreateSetter/필드 리플렉션 루프를 타지 않고,
    미리 만들어 둔 Setter 만 호출합니다.

  • Create<T>(): TryGetGeneratedFactory 성공 시 ConstructorInfo.Invoke 없이 인스턴스를 만듭니다.

스트리핑·AOT 제약에 노출되는 API 표면이 줄어듭니다.


폴백이 IL2CPP에서 약해지는 지점

SDK 주석·가드 메시지가 공통으로 짚는 부분입니다.

  1. Expression.Compile
    환경에 따라 실패할 수 있고, 그때 FieldInfo.SetValue 로 떨어집니다. 동작은 하지만 느리고,
    극단적 설정에서 추가 문제가 날 여지는 있습니다.

  2. ConstructorInfo.Invoke
    Create<T> 가 팩토리 없이 이 경로만 쓰면, 생성자·파라미터 타입이 링커에 의해 제거될 수 있습니다.
    link.xml 보존이나 팩토리 생성(partial) 이 대응입니다.

해당 라이브러리를 사용하지 않더라도, link.xml 혹은 기타 Linker 용도의 브릿징 스크립트를 유지하십시오.

IL2CPP 컴파일 시, Reflection Field 가 정상 작동하지 않을 확률이 매우 높아집니다.
이를 보존하여, 플레이 빌드를 유지하는 것이 개발자 입장에서 유리합니다.

  1. 필드 세터 폴백
    SetValue는 일반 리플렉션과 같아 기능 위주의 경로입니다.

운영 권장

  • 주입·생성이 필요한 타입은 public partial class 로 두어 제너레이터 플랜·팩토리가 붙게 합니다.

  • UNInjectFallbackGuard 플레이 직전 경고 목록을 배포 전에 0에 가깝게 만듭니다.

  • 폴백이 남는 타입만 link.xml 등으로 보존 규칙을 검토합니다.


기타

위험
  • UNInjectProfiler IL2CPP 빌드에서도 동작은 하나, 프로덕션에는 프로파일링 심볼을 넣지 마십시오.

배포 빌드에서는 요구되지 않는 잉여 메모리 소모입니다.