[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 | Wrapper Class test 3 |
+1. 이렇게 Native Library를 혼용하실거라면 .NET의 Interopservice, marshal과 같은 모듈들에 대해 공부하신다면 더 능숙하게 사용할 수 있습니다.
+2. 참고로 위와 같은 방식으로 .NET의 함수나 Class들을 참조 추가해 준다면 C++에서도 C#의 함수를 사용할 수 있습니다. 대신 조금씩 다른 C++/CLI의 문법들만 조심하시면 됩니다.