간혹 C#으로 짜다보면 소스를 공개하기 싫거나 뭔가 중요한것 혹은 성능상 C#으로 할 수 없는 것들
은 DLL로 만들어 두고 작업을 하였었다. (C#은 소스가 보이기 땜시.. )
C#에서 DLL을 Access하기 위해 P/Invoke라는것을
이용한다. MSDN을 보면 주저리 주저리 말이 많은데... 크게 다음과 같은 Step으로 연동을 시킨다.
1. DLL을 만든다. (당근이다.) / C++ part
DLL 이름은 Test.dll 이라고 가정하자..
int _declspec(dllexport) Test(int a)
{
}
2. DLL holder class를 만든다. 그리고 함수를 선언 한다. / C#
class Holder
{
[DllImport("Test.dll")]
public export static int Test(int);
}
3. Call 한다.
Holder.Test(10);
이렇게가 기본적으로 하는 것인데... 그 동안 안해본게 있엇다. Callback 함수나 Array는 어떻게 전달
될까라는 점이다.
Callback 함수 전달 법을 보자.
1. Callback 함수 원형을 정의 한다. (in DLL)
typedef BOOL __stdcall Callback(int a, int b); <-- __stdcall을 안하면 뻑난다.
대부분 CALLBACK이나 WINAPI로 재정의
되어 있다.
2. Callback 함수를 등록 하는 루틴을 만든다. (in DLL)
Callback * _cb ;
void RegCallback(PVOID * pcb)
{
_cb = pcb;
}
2. Callback 함수를 호출 하는 루틴을 만든다. (in DLL)
if ( _cb != NULL )
{
(_cb)(10);
}
3. Callback 함수 선언을 한다. (in C#)
public delegate uint Callback(int a, int b);
4. DLL holder class를 만든다. 그리고 함수를 선언 한다. (In C#)
class Holder
{
[DllImport("Test.dll")]
public export static int RegCallback(Callback cb);
}
5. 실제 수행할 Callback 함수 Body를 만든다. (In C#)
uint CBTest(int am int b)
{
...
}
6. Call 한다. (In C#)
Holder.RegCallback(new Callback(CBTest));
7. 끝이다. /(-o-)/
Array는 그냥 array [] 를 넘기면 되겠다. --.--
참고로 C++함수에 인자로 boo을 쓰면 C#에서 뻑나는 것 처럼 보인다. 예전에 그것때문에
고생한적이 ...
'Programming' 카테고리의 다른 글
Window에서 SNMP 써보기 (추가 업 예정) (0) | 2007.05.10 |
---|---|
리본 콘트롤 라이센싱 (0) | 2007.04.24 |
EXIF Sample을 하나 분석 해 보았다. (0) | 2007.03.06 |
디카 내용을 보기 위한 EXIF에 대해서 ... (0) | 2007.02.27 |
세톱박스에 대해서 알아보던중 (0) | 2007.02.08 |