반응형
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
반응형
'C#' 카테고리의 다른 글
user32.dll - 특정 창의 위치 가져오기 (0) | 2020.10.21 |
---|---|
user32.dll - 프로세스 목록 (process list, window titles) 가져오기 (0) | 2020.10.21 |
[C#] 시리얼 통신 - C#으로 아두이노와 시리얼 통신하기 (0) | 2020.10.15 |
[C#] 매크로 만들기 ver.2 - 마우스 클릭 매크로 (0) | 2020.10.15 |
[C#] user32 클릭으로 익스플로러 alert 닫기 + 쓰레드 (0) | 2020.10.14 |
최근댓글