Frontend/Unity

모노디벨롭에서 unsafe 모드 실행하기

에반황 2016. 11. 23. 10:37


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.


서론

 C#의 2차원 배열의 메모리 구조를 확인하기 위해 변수의 주소값을 찍어보려다 

Unsafe code requires the `unsafe' command line option to be specified

에러가 떴습니다. 이를 어떻게 해결해야 하는지와 변수의 주소 값을 찍는 방법 두 가지를 다뤄보도록 하겠습니다. 

1. 예제코드
2. 유니티에서 unsafe 코드를 사용하는 방법
3. C#의 메모리 구조



예제코드


using UnityEngine;
using System.Collections;
using System; 
using System.Collections.Generic; 
using System.Text; 

public class NewBehaviourScript : MonoBehaviour {

    void Start () {
        int i, j;
        // 4행 2열의 배열 선
        int[,] array = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

        // 안전하지 않은 포인터를 사용하기 위한 코드
        unsafe {
            for (i = 0; i < 4; i++) {
                for (j = 0; j < 2; j++) {
                    // 가비지 콜렉터가 변수를 이동시키지 못하게 함
                    fixed(int *a =&array[i, j]) {
                        Debug.Log ((int)a);
                    }
                }
            }
        }

    } 
}


C#에서 포인터를 사용하기 위한 unsafe와 가비지 콜렉터가 해당 변수를 이동시키지 못하게 하는 fixed문을 사용했습니다. 이 코드를 바로 사용하게 되면 unsafe한 문장을 사용했다고 에러가 뜨게 되죠.


유니티에서 unsafe 코드를 사용하는 방법

구글링 결과 두 가지 방법이 나오는데 대부분의 글이 (ㄱ) 에 관한 글이었지만 해결할 수 없었으므로 필자는 (ㄴ) 방법을 사용했습니다. 


ㄱ. 모노디벨롭 내에서 unsafe 코드 사용가능하도록 세팅


1. Project - Assembly-CSharp Options



2. General - Languege Options 탭 - Allow 'unsafe' code 체크



ㄴ. Asset내에 rsp 파일 생성


1. Api Compatibility Level을 to .NET 2.0 Subset 로 바꿉니다.



2. 프로젝트 경로/Asset에 smcs.rsp 파일을 만듭니다. 그리고 유니티와 모노디벨롭을 재 시작해줍니다.

 



C#의 메모리 구조

이제 간단하게 2차원 배열의 주소값을 찍어볼 수 있게 되었습니다. 결과를 통해 C# 2차원 배열의 메모리 구조는 선형적임을 확인했습니다.





반응형