본문 바로가기

[Proramming]/C#

C# 에서 포인터 처리 - unsafe 키워드 사용

C#에서 포인터 처리 - unsafe 키워드 사용
일반적으로 C#에서는 CLR이라는 놈이 메모리를 관리 해주기 때문에 포인터 처리 차체를 기본적으로 처리 하지 않는다. 
따라서 C의 * , & 를 이용한 코드를 포팅하려면 에러가 발생한다.  특히 DLL을 사용하려면 포인터 처리하는 부분이 많은데 이때 난감하다. 하지만 C#에서 포인터 처리 할 수 있는 방법이 없지는 않다.

unsafe 라는 키워드를 사용하면 C의 포인터를 처리 할수 있다.

USB FIFO칩인  FT245 제어를 위한 DLL을 제공하는데 대부분 포인터를 처리해야 한다.
예로 FT245에 데이터를 쓰는 함수인 FT_Write를 사용할 경우 쓰여진 데이터 수를 받아오는 인자가 있는데 이때 포인터를 써서 받아 온다. 하지만 그냥 컴파일 해 보면 
"고정되지 않은 식의 주소는 fixed 문의 이니셜라이저를 통해서만 가져올 수 있습니다" 라는 에러 메세지를 출력한다. 이때 사용하는 함수 부분에 unsafe 키워드를 사용하면 에러 없이 사용할 수 있다.

DLL선언부
        // FT_Write
        [DllImport("ftd2xx.dll")]
        unsafe private static extern uint FT_Write(uint ftHandle,
                     [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
                     uint BufferSize, uint* BytesWriten);


제어 함수 사용예
        unsafe private void button3_Click(object sender, EventArgs e)
        {
            //데이터 출력 - LED Off
            uint writesize;
            InOut_data[0] = 0xFF;

            FT_Write(m_ftHandle, InOut_data, 1, &writesize);
        }

반응형