Programming/C++/CLI

C#에서 Native C++ 프로젝트 사용하기

blueasa 2010. 5. 31. 21:52

Wrapping을 이용해 C#에서 Native C++ 프로젝트 사용하기

 

Lib 프로젝트 생성

Native C++에 해당하며, 실제 프로그램 로직등은 이곳에 속해있다.

간단하게 Framework 클래스를 만들어보자.

 

  1. class CFramework
    {
    public:
            void Create( HWND hwnd )
            { 
                    // 핸들을 받아 D3D 디바이스 생성
            }
    };

 

DLL 프로젝트 생성

프로젝트 속성에서 공용 언어 런타임 지원을(/clr) 설정해준다.

위에 작성한 프로젝트를 빌드 후 나오는 Lib 파일을 불러오고, 헤더를 추가해준다.

랩핑 클래스를 작성하고, 랩핑할 클래스의 객체를 선언 후 사용하면 된다.

밑의 코드에서 CFramework의 Create함수를 랩핑하고 있다.

 

  1.  // 엔진의 정적 라이브러리
    #ifdef _DEBUG
    #pragma comment ( lib, "Engine_d.lib" )
    #else
    #pragma comment ( lib, "Engine.lib")
    #endif

    // 랩핑 클래스 구현
    #pragma once
    #include "Framework.h" // 랩핑할 Native C++ 클래스 헤더를 참조

    using namespace System;
    namespace CWrapper {

            public ref class CFrameworkWrapper
            {
            public:
                    CFrameworkWrapper();
                    ~CFrameworkWrapper();

            public:
                    void Create( IntPtr hWnd )
                    {
                            m_hHwnd = (HWND)hWnd.ToInt32();

                            m_pFrameWork = new CFramework();
                            m_pFrameWork->Run( m_hHwnd );
                    }

            protected:
                    HWND m_hHwnd;
                    CFramework* m_pFrameWork;
            };
    }

 

C# 프로젝트 생성

C#의 Windows 응용프로그램 프로젝트를 생성해준다.

폼 디자이너에서 적당히 폼을 만들어주고 PictureBox 컨트롤을 배치해준다. 이 컨트롤에 실제 화면이 그려지게 된다.

그 다음 솔루션 탐색기에서 참조 추가를 이용해 위에 작성한 프로젝트의 DLL ( 미리 빌드 해놓자 )을 찾아서 추가해준다.

 

ref.jpg

 

ref2.jpg 

 

DLL이 성공적으로 추가 되면, 랩핑 클래스를 사용할수 있게 된다.

랩핑 클래스에서 선언한 네임 스페이스를 선언한 후 랩핑 클래스 객체를 생성하자.

그 다음 Create 함수에 PictureBox 핸들을 인자로 넘겨주면, Native C++쪽의 CFramework에서 이 핸들을 쓸수 있게된다.

정상적으로 작업이 수행되면, Native C++쪽에서 만들어지는 화면이 C#의 PitureBox에  그려지게 된다

 

  1. using CWrapper;
  2. public partial class Mainform : Form
    {
            private CFrameworkWrapper m_Frameowrk;

            public Mainform()
            {
                    InitializeComponent();
            }

            public void InitializeFramework()
            {
                    m_Frameowrk = new CFrameworkWrapper(); 
                    m_Frameowrk.Create(pictureBox1.Handle);
            }
    }

 출처 : http://tatis3.springnote.com/pages/4160233

반응형