shepherd's Blog

[C++/CLI] C# C++ 연동 본문

.NET

[C++/CLI] C# C++ 연동

shepherd.dev 2015. 8. 4. 11:25

[C++/CLI] C# C++ 연동


 .NET환경에서 c/c++로 만들어진 dynamic Library(DLL)은 DLLImport를 통해 바로 사용가능합니다. 하지만 Static Library(lib, so)들은 사용할 방법이 없어서 다시 DLL로 만들어 주어야만 사용할 수 있습니다. 다시 lib를 dll로 만들려면 코드 수정이 불가피하게 되고, 기존에 이 정적 라이브러리를 사용하던 프로젝트들까지 생각해야 할 수 있습니다.

 하지만 기존의 정적 라이브러리를 C++/CLI Wrapper Class로 만든다면 기존의 코드는 수정할 필요없이 DLL을 만들어 줄 수 있습니다.


 1. C++ static library

 win32 프로젝트로 static library 탭을 체크해서 프로젝트를 만들어 주시고, 다음과 같은 Add class를 static library로 만들어 주겠습니다. 빌드하시면 lib가 생성됩니다.

1

2

3

4

5

6

7

class AddClass

{

public:

explicit AddClass() { }

virtual ~AddClass() { }

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

}; 


2. C++/CLI Dynamic Library

 다음은 C++/CLI 동적 라이브러리를 만들어 줄 차례입니다. 같은 솔루션안에서 C++/CLI(CLR Library 프로젝트 생성) 프로젝트를 생성해주시고, 생성한 프로젝트에서 추가->참조 를 클릭해 주세요. 그럼 참조추가창이 뜹니다. 여기에 [1]에서 만들어준 프로젝트를 추가해 주시고, 다음처럼 Wrapper Class를 만들어 줍니다.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#include "..\UnmanagedCal\AddCal.h"

using namespace System;


namespace managedCal

{

    public ref class AddCalWrap

   {

    protected:

      AddCal *m_pAddCal;


    public:

      AddCalWrap() { }

      virtual ~AddCalWrap()

      {

if (m_pAddCal)

{

delete m_pAddCal;

m_pAddCal = 0;

}

     }

     int Add(int _num1, int _num2)

     {

          return (m_pAddCal->Add(_num1, _num2));

     }

};


 그리고 빌드해 주세요.


3. C#에서 사용

 간단하게 C# Console 프로젝트를 생성하시고, managedCal을 참조추가해주신 다음 아래와 같이 사용해 주시면 됩니다.


1

2

3

4

managedCal.AddCalWrap addobject = new managedCal.AddCalWrap();

int i = addobject.Add(1,2);

Condole.WriteLine("Wrapper Class test");

Console.WriteLine(i);

1
2

Wrapper Class test 

3



 +1. 이렇게 Native Library를 혼용하실거라면 .NET의 Interopservice, marshal과 같은 모듈들에 대해 공부하신다면 더 능숙하게 사용할 수 있습니다.

 +2. 참고로 위와 같은 방식으로 .NET의 함수나 Class들을 참조 추가해 준다면 C++에서도 C#의 함수를 사용할 수 있습니다. 대신 조금씩 다른 C++/CLI의 문법들만 조심하시면 됩니다. 



'.NET' 카테고리의 다른 글

[C#] XML  (0) 2015.07.30