본문으로 바로가기

back to the basic : .NET Interoperablility

category 01. 기술 - APP 2013.02.11 11:54

basic이라고 해서 기본적이라는 의미는 아니다. .NET이 세상에 출시된지 10년이 넘었기에 .NET과 관련된 새로운 주제는 아니라는 의미에서의 basic이다. 

■ .NET 상호운용성(interoperability)

 

.NET이라는 새로운 방식으로 컴포넌트를 만들 수 있게 되었지만, 그때도 그랬지만 지금도 여전히 기존의 만들어진 COM 컴포넌트나 Win32를 직접 호출해서 만들어진 프로그램들도 여전히 많다.

.NET이 나오면서 어플리케이션의 세계도 구분이 필요하게 되었는데, .NET 코드가 실행되는 어플리케이션의 세계를 "managed(관리형)"라는 말로 표현하게 되었고, .NET 이전의 어플리케이션의 세계를 "nonmanaged(비관리형)"이라고 표현했다. .NET의 중요한 목표중의 하나는 unmanaged 프로그램들을 단기간에 모두 수정할 수 없다는 현실을 인식하고 그런 프로그램들과의 상호 운용성 (interoperability)을 확보하는 기술이었다. "상호 운용성"이라는 말이 어렵다면 서로 다른 세계의 코드가 마치 자기 세계의 코드를 호출하듯이 서로 호출하고 호출받을 수 있는 것을 말한다고 할 수 있겠다. 
.NET과 unmanaged 프로그램과의 상호운용성은 대상 프로그램에 따라 기술이름이 달라진다.

 

 

 

.NET 코드가 COM 컴포넌트를 호출할 수 있는 기술 : COM interop 기술
COM 컴포넌트가 .NET 코드를 호출할 수 있는 기술 : .NET interop 기술
.NET 코드가 Win32 플랫폼 dll을 호출할 수 있는 기술 : P/Invoke 기술


이 중에서는 COM interop 기술이 가장 많이 사용되는 듯 하고 P/Invokde 기술이 그 다음으로 자주 사용되는 듯 하다. 사실 달봉이는 주로 .NET 프로젝트에 투입되다보니 .NET interop을 사용해본 적은 없다.
그리고 Win32 dll 코드에서 .NET 코드를 호출하는 기술은 없다( 있다면 할 수 없지 뭐. OS에 포함되는 코드에서 설치되지 않을지도 모르는 .NET 어셈블리 코드를 참조한다는 것이 위험하지 않을까? )


COM과 .NET 두 세계를 상호 연동시켜 줄 수 있는 방법은 많을 것이다. 얼른 떠오르는 것은 웹 서비스같은 것을 사용할 수도 있다.
그러나 MS에서는 두 세계의 코드를 직접 연결해주는 중간의 dll을 만들어내는 것을 best practice라고 판단했던 것이다.
즉 한 세계의 정보를 다른 세계가 이해할 수 있는 정보로 전환해주는 역할을 하는 중간 단계의 DlL을 만들어내기로 했던 것이다.

 


COM 래퍼 개요

( http://msdn.microsoft.com/ko-kr/library/5dxz80y2.aspx )
그림에서 처럼 .NET -> COM 컴포넌트를 연결하는 경우와 COM 컴포넌트 -> .NET을 연경하는 경우의 어셈블리 이름이 다르게 지어졌다.

RCW( Runtime Callable Wrapper ) : .NET 코드에서 COM 컴포넌트를 호출하는데 사용하는 어셈블리. COM 컴포넌트를 호출하는데 필요한 모든 일을 이 녀석이 알아서 처리해준다.
CCW( COM Callable Wrapper ) : COM 컴포넌트에서 .NET  컴포넌트를 호출하는데 사용하는 COM 컴포넌트.


그리고 아티클을 읽다보면 primary interop assembly라는 것을 보는 경우도 있다.
이것은 COM 컴포넌트를 포함하고 있는 제품을 만들어서 제공하는 공급 업체가 자사의 제품과 .NET과의 상호 운용성을 위해서
함께 만들어서 제공하는 .NET 어셈블리 즉 RCW 를 말한다.
.NET 프로그램에서 MS 오피스 컴포넌트를 사용하려고 한다면,  Microsoft에서 제공하는 Office Primary Interop Assemblies(PIAs)를 먼저 다운로드(http://go.microsoft.com/fwlink/?LinkId=50479) 받아서 설치해야 한다.

 

■ RCW 생성 방법
http://www32.brinkster.com/srisamp/netArticles/article_16.htm


1) Visual Studio의 참조추가를 이용하는 방법
- COM 컴포넌트 dll을 "참조 추가"로 프로젝트에 추가해서 빌드하면 RCW 어셈블리가 자동 생성된다.
이 방법을 사용하면 생성되는 RCW 파일 이름에 "interop."이라는 접두어가 붙는다. 예를 들어 COM 컴포넌트의 dll 명이 Helloworld.dll이라면 Visual Studio의 참조 추가를 통해서 생성되는 RCW 어셈블리이름은 Interop.Helloworld.dll 이 된다.

2) tlbimp.exe 명령어 사용
Type LiBrary IMPort


■ CCW 생성 방법
http://msdn.microsoft.com/ko-kr/library/tzat5yw6(v=vs.100).aspx

Regasm.exe 명령어 사용

 

■ 좀 더

.NET 개발자라면 RCW의 사용에 더 관심이 가게 될 것이다. 좀 더 자세히 그림을 그려보면 다음과 같다.

 

 

 

 

COM 컴포넌트를 regsvr32.exe로 레지스트리에 등록하면, 레지스트리에는 dll에 포함된 타입 정보들(CLSID) 및 dll 파일의 위치 등이 등록된다. COM 컴포넌트를 인자로 받아서 생성된 RCW 어셈블리에는 COM 컴포넌트의 타입 정보가 .NET에서 사용할 수 있는 클래스로 포함되어 있다.

.NET 코드에서 RCW에 정의된 클래스(타입)를 통해서 COM 컴포넌트에 정의된 객체를 생성하면 생성된 클래스에 해당하는 클래스 ID를 레지스트리에서 찾고 해당 클래스 ID에 해당하는 컴포넌트를 찾아서 결국은 COM 컴포넌트 dll도 참조할 수 있게 된다. 즉 RCW를 통해서 객체를 생성하면 COM 컴포넌트에 포함된 타입의 인스턴스도 생성할 수 있게 된다.

 

업데이트( 2013.05.24 )

 

흔히 하나의 COM 컴포넌트가 다음처럼 두 가지 형태의 래퍼 어셈블리로 사용되는 경우가 있다.

Interop.xxx : 순수한 COM 컴포넌트에 대한 래퍼.
AxInterop.xll : System.Windows.Forms.AxHost 컨트롤을 상속하고 있음. 다른 ActiveX처럼 윈폼에 드래그하거나 해서 사용할 수 있는 컨트롤 래퍼(control wrapper)

 

예로 윈폼에서 IE 웹 페이지를 사용하고 싶을때 xxx.SHDocVw.dll을 사용한다. 이 어셈블리를 사용하면 IE의 객체 모델에 있는 기능을 사용할 수 있다. 이 어셈블리는 다음처럼 두 형태의 어셈블리가 있다.

 

Interop.SHDocVw.dll : 윈폼 어플리케이션과 별도의 IE 프로세스가 생성되면서 웹 화면도 윈폼 화면과 분리되게 구성할 수 있다.
AxInterop.SHDocVw.dll : IE 프로세스 자체는 윈폼 어플리케이션과 별도로 생성되는 것은 마찬가지이만 다른 ActiveX 컨트롤처러 웹 화면을 윈폼 화면에 임베딩되도록 구성할 수 있다.


 

'01. 기술 - APP' 카테고리의 다른 글

.NET 캐시  (0) 2013.08.09
어셈블리 바인딩3-정리  (0) 2013.05.11
back to the basic : .NET Interoperablility  (1) 2013.02.11
LoadFrom 컨텍스트  (0) 2013.02.09
[메모] 디버깅 정보 블로그  (0) 2012.07.29
[메모] Snippy - Visual Studio Code Snippet Editor  (0) 2011.09.28

댓글을 달아 주세요

  1. Favicon of http://twitter.com/ggokka BlogIcon 송영빈 2013.03.20 13:59 신고

    오랜만입니다.
    Win32 dll에서 닷넷 어셈블리를 호출하는 방법이 있네요.
    http://stackoverflow.com/questions/1823466/how-to-call-a-net-dll-from-a-win32-process
    요즘 win32와 닷넷 어셈블리 둘다 해야 하는 상황이라서 공부하고 있습니다.
    종종 도와주세요.

티스토리 툴바