본문 바로가기
SoftWare/Visual C#

C++ DLL Callback 을 C# 루틴으로 가져오기

by 학수씨 2009. 3. 6.
typedef BOOL __stdcall Callback(int a, int b);   //Hslee 콜백 등록!
Callback *_cb;   //C#의 콜백루틴 받아오는 포인터변수

void CallBackCall()  //콜백 루틴시키는 함수...(Callback함수와 연결됨)
{
    if(_cb != NULL)
        (_cb)(10,20);
}

void RegCallback(Callback *pcb)  //C#의 콜백루틴 받아와 연결하는 함수
{
    _cb = pcb;
}
using System.Runtime.InteropServices;

namespace CallbackTest
{
    class Program
    {   
        [DllImport("CallbackTestDll.dll")]
        static extern void RegCallback1(Callback1 callback);
        delegate bool Callback1(int a, int b);
        
        static bool PrintWindow1(int a, int b)
        {
            Console.Write("a:"+a.ToString() + "b:" + b.ToString()+"\t");
            return true;
        }

        static void Main(string[] args)
        {
            Callback1 callback1 = new Callback1(PrintWindow1);
            RegCallback1(callback1);
        }
    }
}




C#의 delegate루틴을 C++에 넘겨준뒤. C++에서 콜백이 발생됬을경우 C#으로 넘기게된다.
여기서 주의할점.. C#은 콜백을 받아올때 가바지컬렉터 라는 놈이 관리를 하게된다..

Callback발생 -> 카비지컬렉터 -> C# 루틴

뭐 이런식으로 알고있다.. C#은 가비지컬렉터 수집을 자동으로 한다...
Callback이 사용자가 요청했을때만 들어온다면 상관없지만...

uRON(ETRI)의 로봇주행알고리즘 을 사용할경우 콜백이 미친듯이 들어와버리게된다..
그러면서 가비지컬렉터가 싸이면서.. 프로그램이 종료되게된다..

콜백이 미친듯이 들어오므로 가비지컬렉터수집을 사용자가 직접 해줘야 한다...

C#의 콜백 루틴 안에다가
GC.Collect();

를 넣어주게되면 가비지컬렉터를 강제로 수집하게된다..

자세한사항은 MSDN 참고!



이방법을 구현하기위하 온갖 MSDN을 뒤지면서 나만의 방법으로 바꿔주는데 성공했다.

정말 힘들었던 작업....중 하나.. 정말 유용하게 쓰인다!

나같은 Robot Programming을 하는 사람이라면.. 디바이스제어는 C++
Main Program은 Error가 적은 C#을 사용하용하는 사람들이 꽤 있을거 같다..

'SoftWare > Visual C#' 카테고리의 다른 글

Emgu CV C#용 영상처리 라이브러리  (0) 2009.03.16
C# Class Library 만들기(이벤트 포함)  (0) 2009.03.08
C# Process Class  (0) 2009.03.06
C# 윈도우메세지 WM_USER MESSAGE 받기  (0) 2009.03.06
C# 대리자 Invoke  (0) 2009.03.06

댓글