C++/CLI 소개
프로그램들 간에 연동을 해야 하는 경우가 생겼다. 처음부터 하나의 언어로 작성된 프로그램들이라면 상관이 없겠지만 Native code 인 MFC 로 작성된 프로그램과 .NET Framework 기반의 C#으로 작성된 프로그램의 연동이라 쉽지많은 않다. 소켓을 이용한 통신을 해야 하기에...
두 프로그램간 연동 방법은 많이 있지만 Managed C++ 보다 효율적인 방법인 C++/CLI 를 알아 보려고 한다.
Native Code 로 작성된 API들을 C# 에서 사용하려고 할 때, 마샬링~ 한다고 하는데 마샬링의 사전적인 의미를 찾아 보았다.
Cf) Marshalling (마샬링)
컴퓨터 과학(Computer Science)/컴퓨터 프로그래밍 에서 Marshalling (serialization 과 유사한) 은 하나의 객체에 대한 메모리를 적절한 데이터 포멧으로 변환 하는 처리 과정을 말한다. Marshalling 은 일반적으로 하나의 프로그램 또는 하나의 컴퓨터에서 또 다른 곳으로 이동할 때 발생한다.
즉, 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을, 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우 발생한다.
http://enc.daum.net/dic100/contents.do?query1=2015757137
http://k.daum.net/qna/openknowledge/view.html?qid=3Am1y
인터넷에 C++/CLI 로 검색해 보면 많은 내용이 나온다.
공부할 겸 정리해 보았다.
C++/CLI 는 Managed Code(관리되는 코드) 즉, C# 과 같은 하나의 언어(?!) 이다. C++/CLI 는 Unmanaged code 인 C++ 코드를 감싸서 C# 과 같은 Unmanaged Code 에서 이를 이용할 수 있도록 하는 기술이다. 따라서 C++ 라이브러리를 잘만 감싸면 C# 에서 아무런 수고 없이 이 코드를 이용할 수 있다.
참고로 C++/CLI 는 Visual Studio 2005 이상 버전부터 지원한다.
CLI (Common Language Infrastructure)
CLI(공통 기반 언어) 는 ECMA(정보와 통신 시스템을 위한 국제적이면서도 회원국 기반의 비영리 표준화 기구) 의 공인을 받은 공개된 명세이다. 즉, CLI 는 표준 명세이고 이에 맞쳐 구현하는 일은 각 벤더나 오픈 소스 프로젝트의 몫이다. CLI 가 말하는 표준 명세란 하드웨어 플랫폼과 독립적인 “공통 중간 언어(Common Intermediate Language)” 를 두는 것을 말하며, C# 이 공통 중간 언어로 MSIL을 두는 것이 대표적이다.
Unmanaged Programming
unmanaged 환경에서는 메모리를 할당하기 위하여 new/malloc 를 사용한다. 메모리 해제는 사용자의 책임하에 delete/free 를 사용하여 메모리 해제 시킨다. 만약 메모리 해제 시키지 않으면 메모리 릭(leak) 이 발생한다. 컴파일러는 긴밀하게 OS(Operating System) 와 Hard Ware 에 연관되어 있으며, 프로그래밍을 위해 OS 에서 제공하는 API 들을 사용한다. 대표적인 언어로는 C++,VB 등이 있다.
Managed Programming
Managed 환경에서는 BCL(Base Class Library) 라이브러리를 사용하여 프로그래밍 한다. BCL 은 응용프로그램이 실행될 플랫폼의 통료 역할을 한다. BCL 은 프로그래밍을 위함 모든 API 들을 제공한다. 또한 서비스 성격(File System, Network, User Interface, Process, Threads, ETC)에 따라 적절한 namespace 아래에 구성되어 있다. 이들 중 몇몇은 자동적으로 메모리가 관리된다. (메모리 할당은 사용자가 원할 때 할당하며, 메모리 해제는 프로세스가 CRL 의 Garbage Collection 을 호출하여 자동적으로 해제한다.)
What is C++/CLI ?
ANSI/ISO C++ 은 Windows 에서 프로그래밍하기 위한 프로그래밍 언어 이다. .NET 은 하드웨어 독립적인 새로운 플랫폼 이다. 따라서 실행 엔진, 가상 프로세서(CLR) 을 소유하고 있다. C++ 은 타겟 플렛폼에 대한 실행 파일을 만들어 낸다. 반면에 Managed Code 로 프로그래밍된 프로그램은 CLR 을 위한 IL Code 를 만들어 낸다. Managed 환경에서 프로그래밍 언어들은 프로그래밍 하기 위해 CLI(Common Language Infrastructure) 과 CTS(Common Type System) 를 필요로 한다.
ANSI/ISO C++ 은 CLI, CTS 를 이용하지 않기 때문에 .NET 플랫폼 프로그램을 만들 수 없다. 반면에 C++/CLI 는 새로운 언어(C와 C++ 과 비슷한) 이다. .NET 플랫폼에서 동작하는 프로그램을 만들기 위해 만들어 졌다. 따라서 Syntax, grammer, rule 들이 C++ 과 비슷하다. C++ 은 C++/CLI 에 포함된다.
C# 의 대체물로서의 C++/CLI
C++/CLI 는 Microsoft 가 C++ 개발자를 .NET 개발로 끌어들일 목적으로 만들었다는 소문이 있지만 결론적으론 C++/CLI 는 어려운 문법으로 인하여 C++/CLI 를 익히는 것 보다 C# 을 익히는게 더 쉽다.
C++/CLI 의 진정한 가치
기존에 작성한 Native C++ 라이브러리와 닷넷 프레임워크를 연결하는 역할은 C++/CLI 밖에 할 수 없다. 고도의 성능이 필요한 시스템에선 핵심은 Native code 로 작성하고, 그 위에 안정성이나 빠른 개발 속도가 요구되는 부분은 관리되는 코드로 작성하는데 그 사이를 C++/CLI 를 이용하게 된다.
C++/CLI 의 기본 타입
C++/CLI 역시 CLI 의 한 구현물 이므로 CTS(Common Type System) 에서 말하는 기본 타입을 모두 지원한다.
C++/CLI 는 C++, C#, VB.NET 에서 .NET 프로그램을 작성하는 것을 의미!!
Native code 를 Managed Code 로 포팅하기
.NET 유틸리티 중에 “.NET Reflector(http://www.red-gate.com/products/reflector/)” 라는 것이 있다. 이 유틸리티는 어셈블리(exe, dll 파일)의 코드를 디어셈블리하여 C#등의 언어로 다시 보여준다.
위 글은 다음 웹사이트를 참조 하였습니다.
http://www.dogfootlife.com/archives/73
http://kaistizen.net/EE/index.php/imaso/cplusplus_cli_lecture_2009_01/