반응형

C# 작업을 하다보면 C++로 코드를 작성해야 하는 경우가 있다.

C#에서 C++ 사용

 

1. C++ lib 생성

1) 솔루션에 C++ 정적 library 프로젝트 추가

 

2) CPP 헤더파일(.h)/소스파일 코드(.cpp) 작성

-. 헤더파일

#pragma once
class ImgCompare
{
private:
	explicit ImgCompare(const ImgCompare& _rImgCompare);
	ImgCompare& operator=(const ImgCompare&);


public:

	ImgCompare();
	~ImgCompare();


	int Add(int _num1, int _num2);

};

-. 소스파일

#include "pch.h"
#include "framework.h"
#include "CPP.h"


// TODO: 라이브러리 함수의 예제입니다.

#include <iostream>

ImgCompare::ImgCompare()
{

	std::cout << "CPP 생성" << std::endl;
}

ImgCompare::~ImgCompare()
{
	std::cout << "CPP 소멸" << std::endl;
}

int ImgCompare::Add(int _num1, int _num2)
{
	return(_num1 + _num2);
}

 

3) 이후 build를 하면 솔루션의 debug 폴더에 lib 파일이 생긴다.

 

2. DLL 생성

1) CLR 프로젝트를 추가해서 CPP 참조 추가

 

2) CLR 헤더/소스파일 작성

-. 헤더파일

#pragma once

using namespace System;

#include "../CPP/CPP.h"


namespace CLR {
	public ref class Logic
	{
	protected:
		ImgCompare* m_pImgCompare;

	public:
		Logic();
		virtual ~Logic();
		int Add(int _num1, int _num2);
	};
}

-. 소스파일

#include "pch.h"

#include "CLR.h"

#include <iostream>
namespace CLR
{
	Logic::Logic() : m_pImgCompare(new ImgCompare)
	{
		std::cout << "CLR 생성" << std::endl;
	}

	Logic::~Logic()
	{
		std::cout << "CLR 소멸" << std::endl;
		if (m_pImgCompare)
		{
			delete m_pImgCompare;
			m_pImgCompare = 0;
		}
	}

	int Logic::Add(int _num1, int _num2)
	{
		return (m_pImgCompare->Add(_num1, _num2));
	}
}

3) 마찬가지로 buld해서 dll 파일 생성

3. C# 프로젝트 구성

1) CLR 프로젝트 참조 추가 (CPP 프로젝트 참조추가 X)

2) C# 코드 작성

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            a += 1;
            b += 2;

            CLR.Logic obj = new CLR.Logic();

            MessageBox.Show(obj.Add(a, b).ToString());

            obj.Dispose();



        }

이후 실행하면 C++에서 보내주는 값을 그대로 보여주는 것이 확인된다.

 

 

번외.

C# 프로젝트를 먼저 생성한게 아니라면 원하는대로 실행이 안될 수 있는데, 이 땐 C# 플젝에 우클릭 해서 시작 프로젝트로 설정하면 된다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기