본문 바로가기

C#/Unity

[IL2CPP] Assembly.GetCallingAssembly 가 동작하지 않을 때

IL2CPP 환경에서 Assembly.GetCallingAssembly().GetTypes() 메소드가 기대한 것과 같이 동작하지 않을 때


어셈블리 문제

알 수 없는 이유(버그?) 로 Assembly.GetCallingAssembly() 메소드는 Mono2x 일때와 IL2CPP 일 때 다른 값이 반환됩니다. 이를 해결하기 위해 해당 메소드 대신 typeof(FooType).Assembly 식의 접근법으로 어셈블리를 가져오는것으로 고칠 수 있습니다. 

(FooType은 찾고자 하는 어셈블리 안에 들어있는 타입이어야 합니다.)


(또는) 코드 스트리핑 

http://docs.unity3d.com/kr/current/Manual/iphone-playerSizeOptimization.html

스트립은 정적 코드 분석에 의존하고 있어 효율적으로 수행하기 어려운 경우가 있으며, 특히 reflection처럼 동적 기능이 사용되는 경우 그렇습니다. 그런 상황에서 어떤 클래스를 제외하거나 정보를 팁으로 전달해야 합니다. Unity는 블랙리스트 를 프로젝트 단위로 지원합니다. 블랙리스트를 사용하려면link.xml 파일을 만들어 Assets 폴더에 넣으면 됩니다. link.xml의 기재 방법의 예제는 다음과 같습니다 : -

유니티는 바이너리 최적화를 위해 쓰이지 않는 코드를 빌드타임에 제거합니다.

C#의 리플렉션 기능을 사용해서만 접근되는 클래스들(예를들어 자동 테스트되는 테스트 단위들)은 대부분 코드상에서 직접적으로 레퍼런싱 되지 않기 때문에 사용하지 않는 클래스라고 판단되어 제거됩니다. 이를 방지하기 위해서는 link.xml 파일을 작성해 삭제하지 않고 남겨야 하는 타입들을 지정합니다.