Programming

C#에서 C++ 연동에 대한.. PInvoke

콜러스 XXII 2007. 3. 19. 15:22

 

간혹 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#에서 뻑나는 것 처럼 보인다. 예전에 그것때문에

 

고생한적이 ...