1. C++/CLI란?
'C++/CLI'는 네이티브와 .NET의 중간 지점에 있는 또는 서로를 연결해 주는 언어라고 할 수 있습니다.
2. C++/CLI의 기본적인 흐름
C/C++코드를 C#에서 사용하는 기본적인 방법은 Wrapper 클래스를 통한 방법ㅇ비니다. C++코드를 컴파일 하여 Static Library 파일로 만듭니다. 만들어진 lib 파일을 C++/CLI를 이용해 감싸, dll 파일로 만듭니다. 이렇게 해서 C#에서 이용가능한 Managed Code를 만든 것입니다.
C#에서는 C++/CLI로 만들어진 dll파일을 참조하여 사용하면 됩니다.
3. C++로 Native Code 만들기
간단하게 두 개의 정수 인자를 받아서 합을 반환하는 함수를 만듭니다.
파일->새로만들기->프로젝트, VisualC++->Win32 콘솔 응용프로그램 생성
정적 라이브러리 체크, 나머지 기본값으로 하시고 마침 선택합니다.
- 다음과 같이 작성합니다.
AddCal.h
#pragma once class AddCal { private: explicit AddCal(const AddCal& _rAddCal); AddCal &operator=(const AddCal&); public: explicit AddCal(); virtual ~AddCal(); int Add(int _num1, int _num2); };
AddCal.cpp
#include "stdafx.h" #include "AddCal.h" AddCal::AddCal() { } AddCal::~AddCal() { } int AddCal::Add(int _num1, int _num2) { return(_num1 + _num2); }
- 컴파일 하게 되면 UnmanagedCal.lib 파일이 생성됩니다.
4. C++/CLI로 코드 감싸기
- NativeCode를 Managed Assebly(.dll)로 만들어야 합니다. 이 때 사용하는 것이 C++/CLI로 클래스를 작성하여 Native코드를 감쌉니다.
새프로젝트 , VisualC++->CLR->클래스 라이브러리 선택 후 생성합니다.
생성된 프로젝트에 Native Code의 "AddCal.h"파일을 추가합니다.
다음, 파일->추가->기존 프로젝트 선택 후, Native Project를 추가합니다.
프로젝트 속성으로 들어 간 후, 참조에 NativeCode로 작성한 Project를 추가합니다.(새 참조 추가를 누르시면 됩니다.)
이제 코드를 다음과 같이 작성합니다
managedCal.h
#pragma once #include "..\UnmanagedCal\AddCal.h" using namespace System; namespace managedCal { public ref class AddCalWrap { protected: AddCal* m_pAddCal; public: AddCalWrap(); virtual ~AddCalWrap(); int Add(int _num1, int _num2); }; }
managedCal.cpp
// 기본 DLL 파일입니다. #include "stdafx.h" #include "managedCal.h" namespace managedCal { AddCalWrap::AddCalWrap() : m_pAddCal(new AddCal) { } AddCalWrap::~AddCalWrap() { if (m_pAddCal) { delete m_pAddCal; m_pAddCal = 0; } } int AddCalWrap::Add(int _num1, int _num2) { return (m_pAddCal->Add(_num1, _num2)); } }
- 컴파일 하면 dll파일이 생성됩니다.
5. C#을 이용해 C++/CLI로 생성된 dll 파일 이용하기
- 새 프로젝트 생성
-다음, 파일 -> 추가 -> 기존프로젝트 'ManagedCal', UnManagedCal' 두 개의 프로젝트를 불러옵니다
- 프로젝트 오른쪽 버튼-> 추가->참조를 선택 후
-managedCal프로젝트를 선택합니다.
-다음과 같이 작성하고 실행시켜주면 됩니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CliDemo { class Program { static void Main(string[] args) { managedCal.AddCalWrap obj = new managedCal.AddCalWrap(); Console.WriteLine(obj.Add(1, 2)); Console.Read(); } } }
참고 블로그 : http://six605.tistory.com/384
'Software Development > Application Develop' 카테고리의 다른 글
OpenCV 동영상에서 원하는 프레임만 가져오기 (1) | 2014.10.20 |
---|---|
OpenCV 이미지 띄우기 (0) | 2014.10.20 |
2. WPF + OpenCV(dll) (2) | 2014.10.11 |
1. OpenCV 설치하기 (1) | 2014.10.11 |
MFC 기초 (0) | 2014.07.22 |