C++ DLL Callback 을 C# 루틴으로 가져오기
Programming/C++/CLI / 2012. 5. 3. 17:04
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 참고!
Callback발생 -> 카비지컬렉터 -> C# 루틴
뭐 이런식으로 알고있다.. C#은 가비지컬렉터 수집을 자동으로 한다...
Callback이 사용자가 요청했을때만 들어온다면 상관없지만...
uRON(ETRI)의 로봇주행알고리즘 을 사용할경우 콜백이 미친듯이 들어와버리게된다..
그러면서 가비지컬렉터가 싸이면서.. 프로그램이 종료되게된다..
콜백이 미친듯이 들어오므로 가비지컬렉터수집을 사용자가 직접 해줘야 한다...
C#의 콜백 루틴 안에다가
GC.Collect();
를 넣어주게되면 가비지컬렉터를 강제로 수집하게된다..
자세한사항은 MSDN 참고!
이방법을 구현하기위하 온갖 MSDN을 뒤지면서 나만의 방법으로 바꿔주는데 성공했다.
정말 힘들었던 작업....중 하나.. 정말 유용하게 쓰인다!
나같은 Robot Programming을 하는 사람이라면.. 디바이스제어는 C++
Main Program은 Error가 적은 C#을 사용하용하는 사람들이 꽤 있을거 같다..
정말 힘들었던 작업....중 하나.. 정말 유용하게 쓰인다!
나같은 Robot Programming을 하는 사람이라면.. 디바이스제어는 C++
Main Program은 Error가 적은 C#을 사용하용하는 사람들이 꽤 있을거 같다..
반응형
'Programming > C++/CLI' 카테고리의 다른 글
C#에서 managed C++로 윈도우 핸들을 보내는 방법 (0) | 2011.09.08 |
---|---|
cli::array<t>^<t> (0) | 2011.03.24 |
System.String → char * (marshal_context) (2) | 2010.12.20 |
Part 1: How to Make Native Calls from Managed Code in C++/CLI (0) | 2010.12.20 |
Arrays in C++/CLI (0) | 2010.11.26 |