IL2CPP
UNInject는 에디터/모노에서 돌아가는 리플렉션·Expression 경로와,
Roslyn이 만들면 대리(delegate)·팩토리만 쓰는 경로가 갈립니다.
IL2CPP(AOT) 에서는 후자가 훨씬 안전합니다.
왜 Roslyn 플랜이 유리한가
-
필드 주입: 생성 플랜이 있으면
TypeDataCache가CreateSetter/필드 리플렉션 루프를 타지 않고,
미리 만들어 둔Setter만 호출합니다. -
Create<T>():TryGetGeneratedFactory성공 시ConstructorInfo.Invoke없이 인스턴스를 만듭니다.
즉 스트리핑·AOT 제약에 노출되는 API 표면이 줄어듭니다.
폴백이 IL2CPP에서 약해지는 지점
SDK 주석·가드 메시지가 공통으로 짚는 부분입니다.
-
Expression.Compile
환경에 따라 실패할 수 있고, 그때FieldInfo.SetValue로 떨어집니다. 동작은 하지만 느리고,
극단적 설정에서 추가 문제가 날 여지는 있습니다. -
ConstructorInfo.Invoke
Create<T>가 팩토리 없이 이 경로만 쓰면, 생성자·파라미터 타입이 링커에 의해 제거될 수 있습니다.
link.xml보존이나 팩토리 생성(partial) 이 대응입니다.
해당 라이브러리를 사용하지 않더라도, link.xml 혹은 기타 Linker 용도의 브릿징 스크립트를 유지하십시오.
IL2CPP 컴파일 시, Reflection Field 가 정상 작동하지 않을 확률이 매우 높아집니다.
이를 보존하여, 플레이 빌드를 유지하는 것이 개발자 입장에서 유리합니다.
- 필드 세터 폴백
SetValue는 일반 리플렉션과 같아 기능 위주의 경로입니다.
운영 권장
-
주입·생성이 필요한 타입은
public partial class로 두어 제너레이터 플랜·팩토리가 붙게 합니다. -
UNInjectFallbackGuard플레이 직전 경고 목록을 배포 전에 0에 가깝게 만듭니다. -
폴백이 남는 타입만
link.xml등으로 보존 규칙을 검토합니다.
기타
UNInjectProfilerIL2CPP 빌드에서도 동작은 하나, 프로덕션에는 프로파일링 심볼을 넣지 마십시오.
배포 빌드에서는 요구되지 않는 잉여 메모리 소모입니다.