티스토리 뷰

C#에서 Unmanaged Code(C++) 코드 호출하기


1) COM Interop


COM Interop에 대한 기초적은 설명은 아래와 같습니다. 


COM Interop은 닷넷 프레임워크(.NET Framework)에서 공통 언어 런타임(CLR)에 포함된 컴포넌트 오브젝트 모델(COM) 개체를 상호 운용할 수 있게 만드는 기술이다. COM Interop은 COM 컴포넌트의 수정 없이 액세스할 수 있는 기능을 제공하며, COM 타입의 개체를 .NET 타입의 개체에 대응하도록 시도한다. 그리고 COM Interop는 COM 개발자들이 COM 개체에 액세스하는 것만큼 쉽게 관리 개체에 액세스할 수 있도록 허용한다. 


<참조 : 위키 피디아>


구현방법은 아래의 링크를 참조하시길 바랍니다.

COM Interop 자습서http://msdn.microsoft.com/ko-kr/library/aa288434(v=vs.71).aspx


COM Interop를 사용하면 발생하는 장단점에 대해서 알아보겠습니다. COM Interop은 .NET 환경에서 Native Code를 호출하는 가장 비효율적인 방법입니다. 이미 COM 컴포넌트를 사용하는 경우를 제외하고는 가능한 COM Interop를 사용하지 않는 것이 습니다. 그 이유는 IUnknown을 배우는데 시간이 많이 걸리기 때문입니다. 


또한 COM 오브젝트를 수행하기 위한 다양한 코드와 함께 처리가 되므로 수행 속도도 느리며, CLR의 객체 생명 주기 관리와 COM 객체의 생명 주기가 달라서 이 점에 대해서도 충분히 이해를 하고 있어야 합니다.


COM 오브젝트를 사용하면 Wrapper 클래스가 자동적으로 생성이 되게 되고, Wrapper 클래스는 COM Interface에 대한 Release 시점에 소멸자를 실행하게 되는데 이때 객체가 소멸이 되어, Garbarge Collection이 의미가 없어 지게 됩니다. (다만 ReleaseCOMObject 함수를 통해서 개별적으로 소멸시킬 수도 있습니다. 하지만 이방법은 개발자의 복잡성을 높이므로 권하지 않는 방법 중 하나입니다.)


2) P/Invoke


Platform Invocation Services의 약자로, CLR과 같은 CLI 구현 요소 중 하나이다. 이 방법은 Managed Code를 Native Code로 변경하는 역할을 한다. 


P/Invoke의 사용방법은 아래를 참고하시기 바랍니다.

플랫폼 호출 자습서 : http://msdn.microsoft.com/ko-kr/library/aa288468(v=vs.71).aspx


P/Invoke에 대한 단점을 알아보면, P/Invoke로 호출하고자는 함수를 다시 한번 선언해야 하는 단점을 가지고 있지만, 이는 Native 코드의 함수를 어떻게 Managed Code에서 사용되어야 함을 정의하는 것이므로 반드시 필요합니다. 


또한 P/Invoke 방식은 객체지향적인 개념으로 설계가 되지 않았기 때문에 오버로딩, 오버라이딩에 대한 부분을 무시하고 구현시 필요한 함수들을 다 선언해줘야 한다는 단점을 가지고 있습니다. 


3) Microsoft C+의 /clr 컴파일 옵션


/clr 옵션을 사용하여 컴파일을 하게 되면, CLR의 기능을 개발된 프로그램과 관련 구성 요소에서 사용할 수 있게 컴파일 할 수 있습니다. 


상세내용은 아래를 참고하시기 바랍니다.

/clr(공용 언어 런타임 컴파일) 옵션 : http://msdn.microsoft.com/ko-kr/library/k8d11d4s.aspx


/clr 옵션을 사용하면 Native 힙을 사용하는 MSIL 기반의 라이브러리를 생성할 수 있는데, 이는 Managed Code에서 바로 가져올 수 없기 때문에 마샬링을 제공해주는 C++기반의 라이브러리를 재작성해야 하는 단점을 지니고 있습니다.


하지만 이 방식의 최대 장점은 Managed Code와 Unmanaged Code 사이를 직접 컨트롤할 수 있어 프로그램 작성중에 문제를 통제할 수 있습니다. 이는 반대로 C++, C# 기반의 모든 프로그래밍을 해야하는 복잡성을 증대시키는 단점도 가지게 됩니다.


지금까지 .NET Framework 환경에서 비관리 코드(Unmanaged Code)를 호출 하는 방법에 대해서 알아보았습니다. 


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.




댓글