Search

'dllimport 함수'에 해당되는 글 1건

  1. 2018.02.13 C# 에서 C++ DLL 불러서 쓰기 #3

C# 에서 C++ DLL 불러서 쓰기 #3

Programming/C# 2018. 2. 13. 15:49 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C# 에서 C++ DLL 불러서 쓰기 #3















3. Class 가져오기



C++ DLL 에



#ifdef BOX_EXPORTS

#define BOX_API __declspec(dllexport)

#else

#define BOX_API __declspec(dllimport)

#endif











C++


Class BOX_API Box{

public:

Box();

int setInt(int a);

void setString(char* str);

}








이런 클래스가 존재하고






C# 에서 해당 클래스를 불러서 사용하려고 한다,









C#



namespace BoxConsoleApplication

{

    class Program

    {


        unsafe static void Main(string[] args)

        {

             Box b = new Box();

             int c = b.setInt(3);

             b.setString("HelloWorld");


        }

    }

}



이렇게 사용하고 싶다.












하지만 바로 저렇게 사용 할 수는 없다.






참조하여도 해당 멤버들이 [개체브라우저]에 보이지 않는 멤버들을 직접 명시하여 참조해 주어야한다.











C++ 클래스가 보이지 않으므로


C++ 클래스를 활용 할 수 있는 전역 함수들을 만들어서


명시하여 C# 에서 사용한다.



C++


Class BOX_API CBox{

public:

CBox();

int setInt(int a);

void setString(char* str);

}






.h File


extern "C" BOX_API Box* CreateCBox();

extern "C" BOX_API void DisposeCBox(CBox* pObject);







.c File


extern "C" BOX_API CBox* CreateCBox()

{

return new CBox();

}


extern "C" BOX_API void DisposeCBox(CBox* pObject)

{

if (pObject != NULL)

{

delete pObject;

pObject = NULL;

}

}




CBox 객체를 만들고 해당 객체를 반환하고,


CBox 를 받아서 해당 객체를 지워주는 함수 2개를 일단 생성한다.




함수 원형과 함수 구현을 .c , .h 파일로 나누어 두었는데,


.h 에 모두 구현하게 되면


.h(104): error C2491: 'CreateCBox' : dllimport 함수을(를) 정의할 수 없습니다.


라는 에러를 보게 될 것이다.







만들어진 C++ 의 Create, Dispose 함수를 C# 에서 사용 해 본다.









C#



namespace BoxConsoleApplication

{

    class Program

    {


        [DllImport("Box.dll", CallingConvention = CallingConvention.Cdecl)]

        static public extern IntPtr CreateCBox();

        

        

        [DllImport("Box.dll", CallingConvention = CallingConvention.Cdecl)]

        static public extern void DisposeCBox(IntPtr pTestClassObject);


        unsafe static void Main(string[] args)

        {


            IntPtr pCBoxClass = CreateCBox(); ;


            DisposeCBox(pCBoxClass );            


            pCBoxClass = IntPtr.Zero; 


        }

    }

}







이렇게 하면


C++ DLL 의


클래스가


만들어진다.





나머지 멤버 함수들을 가져오는 것은 다음에 정리한다.