출처: http://whiteblank.tistory.com/tag/dll


C#에서 DLL을 Access하기 위해 P/Invoke라는것을 이용한다.

1. DLL을 만든다. / C++
   -> DLL 이름을 Iocp.dll로 정의한다.

       int _declspec(dllexport) Iocp(int a)
      {

       }

2. DLL holder class를 만든다. 그리고 함수를 선언한다. / C#
   ->
       class Holer
       {
             [DllImport!("Iocp.dll")]
             public export static int Iocp(int);
       }

3. Call 한다.
   ->
        Holder.Iocp(10);
       
        이렇게 기본적으로 하는것인데.. Callback함수나 Array는 어떻게 전달 될까라는 점이다.

        Callback 함수 전달법을 보면은
        (1) Callback 함수 원형을 정의한다. (in DLL)

             // __stdcall을 안하면 뻑난다. 대부분 CALLBACK이나 WINAPI로 재정의 되어있다.
             typedef BOOL __stdcall Callback(int a, int b);
             
        (2) Callback 함수를 등록하는 루틴을 만든다. (in DLL)
             
             Callback *_cb;
           
             void RegCallback(PVOID *pcb)
             {
                  _cb = pcb;
             }

        (3) Callback 함수를 호출하는 루틴을 만든다. (in DLL)
             if(_cb != NULL)
             {
                  (_cb)(10);
             }

        (4) DLL holder class를 만든다. 그리고 함수를 선언한다. (in C#)
         
             class Holder
             {
                   [DllImport("Iocp.dll")]
                   public export static int RegCallback(Callback cb);
             }

         (5) 실제 수행할 Callback 함수 Body를 만든다. (in C#)
           
             unit CBIopc(int a, int b)
             {
                     .....
              }

         (6) Call 한다. (in C#)
           
             Holder.RegCallback(new Callback(CBIocp));

      Array는 그냥 array[]를 넘기면 된다.
      참고로 C++ 함수에 인자로 boo을 쓰면 C#에서 깨지는것 처럼 보인다.
             
            

AND