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

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

 

Posted by 부우산사나이
: