c++ lib 를 c# 에서 사용하기 (c++/cli)

2013. 7. 22. 09:44C++


원본 : http://blog.naver.com/limdp99?Redirect=Log&logNo=60034273093

이번에 파티클 에디터를 만들면서 mfc 말고 c# 을 사용해보았는데 c# 문법에 대한 자료는 많지만,

c++ lib 를 c# 에서 사용하는 방법에 대해 자세히 나온곳이 없어서 간단하게 정리해보았습니다.

 

작업순서는

1) c++ 로 lib 작성 (lib)

2) c++/cli 로 wrapper 를 만들고 (dll)

3) c# 에서 wrapper dll 를 호출해서 작업을 하게됩니다.

 

 

직접 해보자면

1) c++ 로 lib 를 하나 만듭니다. 저는 간단하게 다음과 같은 class 를 만들었습니다.

 

class cppLib

{

public :

        int     addValue( int value1, int value2 )

        {

               return ( value1 + value2 );

        }

};
 
 
2) 그 다음에는 c++/cli 로 프로젝트를 만듭니다.

 

 
 
이곳에서 아까 만든 lib 를 link 시켜서 wrapper class 를 만듭니다.
 
[ header ]

namespace cliWrap

{

        public ref class cppLibWrap

        {

        protected :

               cppLib *       m_pCppLib;

 

        public :

               cppLibWrap();

               virtual ~cppLibWrap();

 

               int     addValue( int value1, int value2 );

        };

 

} // namespace - cliWrap

 

 

[ source ]

namespace cliWrap

{

        cppLibWrap::cppLibWrap() : m_pCppLib( new cppLib )

        {}

 

        cppLibWrap::~cppLibWrap()

        {

               if( m_pCppLib )

               {

                       delete m_pCppLib;

                       m_pCppLib = 0;

               }

        }

 

        ////////////////////////////////////////////////////////// 

        int     cppLibWrap::addValue( int value1, int value2 )

        {

               return m_pCppLib->addValue( value1, value2 );

        }

 

} // namespace - cliWrap

 

 

3) wrapper class 작성이 끝났으면  c# 으로 프로젝트를 만듭니다.


 

 

c# 프로젝트 생성후에 위에서 작업한 2개의 프로젝트를 추가시켜줍니다.

 

wrapper class 쪽에서 만들어지는 dll 을 c# 에서 사용하게 되는데 매번 변경사항이

있을때마다 복사하기가 번거롭기 때문에 빌드시마다 자동으로 복사해주는 작업을 해줍시다.

 

 

Command Line 에 copy "$(TargetPath)" "$(SolutionDir)\simpleProject\$(TargetFileName)" 를

자신의 프로젝트 폴더에 맞게 적당히 수정해서 적어줍니다.

 

 

그 후에 dll 복사를 위해 wrapper 프로젝트를 다시 빌드해줍니다.

이제 c# 프로젝트에 c++/cli 로 만든 dll 을 붙여줍니다.
 

 

아까 만든 wrapper class dll 을 추가시켜줍니다.

 


 

 

이제 작업이 끝났습니다.

c# 프로젝트에서는 다음과 같이 그냥 사용하시면 됩니다.

 

namespace simpleProject

{

    public partial class Form1 : Form

    {

        private cliWrap.cppLibWrap m_cppLibWrap = null;

 

        public Form1()

        {

            InitializeComponent();

 

            m_cppLibWrap = new cliWrap.cppLibWrap();

 

            int returnValue = m_cppLibWrap.addValue(1, 2);

 

            MessageBox.Show(returnValue.ToString());

        }

    }

}
 

 
이제 Property Grid 를 비롯해 c# 의 막강한 기능을 누리시면 됩니다.
 
다음에는 c# 에서 Property Grid 를 붙힐때 c++ lib 작업시에 미리 등록을 해서
자동화하는 방법에 대해 설명하고자 하는데 언제가 될지는 모르겠습니다. 하하~
 
 
ps. c#, c++/cli 문법에 대한것은 인터넷에 많기때문에 이곳에서 다루지 않았습니다.
참고할만한 c# 서적이 pdf 로 공개되어있습니다. 참고하시길 바랍니다.