댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
C#
2015.04.21 21:33
C++ lib를 C#에서 사용하는 방법
조회 수 24421 댓글 0
출처 : http://blog.naver.com/limdp99/60034273093 이번에 파티클 에디터를 만들면서 mfc 말고 c# 을 사용해보았는데 c# 문법에 대한 자료는 많지만, c++ lib 를 c# 에서 사용하는 방법에 대해 자세히 나온곳이 없어서 간단하게 정리해보았습니다.
작업순서는 1) c++ 로 lib 작성 (lib) 2) c++/cli 로 wrapper 를 만들고 (dll) 3) c# 에서 wrapper dll 를 호출해서 작업을 하게됩니다.
직접 해보자면 1) c++ 로 lib 를 하나 만듭니다. 저는 간단하게 다음과 같은 class 를 만들었습니다.
class cppLib { public : int addValue( int value1, int value2 ) { return ( value1 + value2 ); } }; 2) 그 다음에는 c++/cli 로 프로젝트를 만듭니다.
이곳에서 아까 만든 lib 를 link 시켜서 wrapper class 를 만듭니다. [ header ] namespace cliWrap { public ref class cppLibWrap { protected : cppLib * m_pCppLib; public : cppLibWrap(); virtual ~cppLibWrap(); int addValue( int value1, int value2 ); }; } // namespace - cliWrap
[ source ] namespace cliWrap { cppLibWrap::cppLibWrap() : m_pCppLib( new cppLib ) {} cppLibWrap::~cppLibWrap() { if( m_pCppLib ) { delete m_pCppLib; m_pCppLib = 0; } } ////////////////////////////////////////////////////////// int cppLibWrap::addValue( int value1, int value2 ) { return m_pCppLib->addValue( value1, value2 ); } } // namespace - cliWrap
3) wrapper class 작성이 끝났으면 c# 으로 프로젝트를 만듭니다.
c# 프로젝트 생성후에 위에서 작업한 2개의 프로젝트를 추가시켜줍니다.
wrapper class 쪽에서 만들어지는 dll 을 c# 에서 사용하게 되는데 매번 변경사항이 있을때마다 복사하기가 번거롭기 때문에 빌드시마다 자동으로 복사해주는 작업을 해줍시다.
Command Line 에 copy "$(TargetPath)" "$(SolutionDir)\simpleProject\$(TargetFileName)" 를 자신의 프로젝트 폴더에 맞게 적당히 수정해서 적어줍니다.
그 후에 dll 복사를 위해 wrapper 프로젝트를 다시 빌드해줍니다. 이제 c# 프로젝트에 c++/cli 로 만든 dll 을 붙여줍니다.
아까 만든 wrapper class dll 을 추가시켜줍니다.
이제 작업이 끝났습니다. c# 프로젝트에서는 다음과 같이 그냥 사용하시면 됩니다.
namespace simpleProject { public partial class Form1 : Form { private cliWrap.cppLibWrap m_cppLibWrap = null;
public Form1() { InitializeComponent();
m_cppLibWrap = new cliWrap.cppLibWrap();
int returnValue = m_cppLibWrap.addValue(1, 2);
MessageBox.Show(returnValue.ToString()); } } } 이제 Property Grid 를 비롯해 c# 의 막강한 기능을 누리시면 됩니다. 다음에는 c# 에서 Property Grid 를 붙힐때 c++ lib 작업시에 미리 등록을 해서 자동화하는 방법에 대해 설명하고자 하는데 언제가 될지는 모르겠습니다. 하하~ ps. c#, c++/cli 문법에 대한것은 인터넷에 많기때문에 이곳에서 다루지 않았습니다. 참고할만한 c# 서적이 pdf 로 공개되어있습니다. 참고하시길 바랍니다. [출처] c++ lib 를 c# 에서 사용하기 (c++/cli)|작성자 휠쓰 출처 : http://six605.tistory.com/384
class AddCal { private: explicit AddCal(const AddCal &_rAddCal); AddCal &operator=(const AddCal &_rAddCal); public: explicit AddCal(); virtual ~AddCal(); int Add(int _num1, int _num2); }; < AddCal.h > #include "stdafx.h" #include "AddCal.h" AddCal::AddCal(void) { // nothing } AddCal::~AddCal() { // nothing } int AddCal::Add(int _num1, int _num2) { return (_num1 + _num2); } < AddCal.cpp >
// 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.h > // 기본 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)); } } < managedCal.cpp>
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CliDemo { class Program { static void Main(string[] args) { managedCal.AddCalWrap obj = new managedCal.AddCalWrap(); Console.WriteLine(obj.Add(1, 2)); Console.Read(); } } } < Program.cs >
Dreamy의 코드 스크랩내가 모으고 내가 보는
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5