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

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

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



4. 멤버 함수 가져오기





C++


#ifdef BOX_EXPORTS

#define BOX_API __declspec(dllexport)

#else

#define BOX_API __declspec(dllimport)

#endif






Class BOX_API Box{

public:

Box();

int setInt(int a);

void setString(char* str);

}






int setInt(int a);

void setString(char* str);




이 멤버 함수들을 가져와서 사용하고 싶다.



참고 : http://tansanc.tistory.com/526?category=772232 [TanSanC]





아래와 같이 사용하고 싶지만


불가능하다



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(); ;



            pCBoxClass.setInt(3);

            pCBoxClass.setString("HelloWorld");




            DisposeCBox(pCBoxClass );            




            pCBoxClass = IntPtr.Zero; 


        }

    }

}





            pCBoxClass.setInt(3);

            pCBoxClass.setString("HelloWorld");




클래스 내부 멤버 변수라 바로 가져올 수는 없다.






사용 할 수 있는 방법은


클래스 생성시와 같이


extern 으로 접근가능 하도록 만들어 주어야 한다.











기본 형태





C++






.h


extern "C" BOX_API int setInt(CBox* pObject, int a);






.cpp


extern "C" BOX_API int setInt(CBox* pObject, int a)

{

if (pObject != NULL)

{

pObject->setInt(a);

}

return -1;

}





이렇게 C++ DLL 내부에서 


클래스 객체에 접근하여


객체의 멤버 함수를 호출하여 준다.











void setString(char* str);



는 다음 글에서....