Microsoft .NET and COM Interoperability

Download Report

Transcript Microsoft .NET and COM Interoperability

Microsoft .NET과 COM의
상호 운용성
Chetan Parmar
기술 지원 엔지니어
개발자 지원, 고객기술지원부
Microsoft Corporation
.NET 상호 운용성

COM Interop (이 주제에 대해 다룰 것입니다.)



Microsoft® .NET에서 COM 구성 요소 호출
COM에서 .NET 구성 요소 호출
플랫폼 호출 (P/Invoke)


관리되지 않는 DLL 파일에서 정적 시작 지점을
호출합니다.
콜백을 위해 함수 포인터를 관리되지 않는 코드로
전달합니다.
Interop을 사용하는 이유

소요되는 시간과 비용을 절약할 수 있습니다.


기존의 코드를 사용합니다.


당장 다시 작성할 필요가 없습니다.
다시 작성하기 위해 시간을 허비하지 않습니다.
기존 코드에 새로운 기능을 추가합니다.


응용 프로그램을 단계별로 마이그레이션합니다.
실제 변경되지 않는 것이 있습니다.
변경되지 않는 코드를 사용한 Interop
COM 상호 운용성 서비스
런타임 유형 시스템
COM 이진 표준
런타임 실행 시스템
C#
VB
COM 이진 표준
MFC/ATL
MSVCRT
런타임 유형 시스템
C++
상반된 대상 비교
관리되지 않는 코드






형식 라이브러리
불변 형식
DLL 문제
인터페이스 기반
HRESULTS
GUIDS
관리된 코드






메타 데이터
복원력이 있는 결합
어셈블리
개체 기반
예외
강력한 이름
프로그래밍 모델
.NET 모델




new 연산자
cast 연산자
메모리 관리
예외
COM 모델




CoCreateInstance
QueryInterface
참조 카운팅
HRESULTS
COM Interop

.NET 클라이언트를 COM 형식에 액세스하도록
허용합니다.
COM

.NET
COM 클라이언트를 .NET 형식에 액세스하도록
허용합니다.
COM
.NET
.NET에서 COM으로의 상호 운용성
IUnknown
공통 언어 런타임
COM 서버
개체
IMyIntf
런타임 호출 가능 래퍼
카운팅되는
참조
클라이언트
추적된
참조
.NET의 COM 형식 사용


COM 형식의 정의를 포함한 Interop 어셈블리를
확보합니다.
Primary Interop Assembly (PIA)



가능한 경우 최우선 (MSDN)
게시자의 사용자 지정 포함
(필요한 경우) 고유의 Interop 어셈블리 생성



Microsoft Visual Studio®에서 형식 라이브러리에
참조를 추가하여 만들 수 있습니다.
형식 라이브러리 가져오기 (TlbImp.exe)를 사용하여
만들 수 있습니다.
형식을 수동으로 지정하여 만들 수 있습니다.
.NET의 COM 형식 사용 (2)

프로젝트를 빌드할 때 Interop 어셈블리를
참조합니다.



Visual Studio에서 참조를 추가할 때 작성할 수
있습니다.
명령줄 컴파일러에서 /r:를 사용합니다.
CSC /t:library /r:MyLib.dll MyCode.cs
형식을 관리된 형식으로 사용합니다.



new 를 사용하여 인스턴스를 만듭니다.
예외 형식을 변환할 수 있습니다.
COM 형식도 확장할 수 있습니다.
가져온 서명 변환 예제
COM 메서드 서명
HRESULT FormatDate(
BSTR s,
DATE d,
[out, retval] int *retval);
.NET 메서드 서명
int FormatDate(String s, DateTime d);
형식 변환 정보









DATE
BSTR
SafeArray(int)
OLECOLOR
CURRENCY
VARIANT
Interface
IMyInterface
coclass Bar
IEnumVariant
System.DateTime
System.String
int[ ]
uint
System.Decimal
System.Object
interface IMyInterface
class Bar
IEnumerator
모델 투명도

형식을 COM 형식으로 고려하지 않습니다.



클래스를 통한 직접 호출


가져오는 중에 기본 인터페이스 구성원이 클래스에
추가됩니다.
특정 인터페이스로 변환합니다.


참조 카운팅 및 Idispatch 없음
Hresults 및 GUID 없음
QI가 실패한 경우 InvalidCastException 발생
실패 HRESULTS는 예외로 자동 매핑됩니다.
예제 : Excel 개체 사용
using Excel;
public static void Main() {
try {
Excel.Application app = new Excel.Application();
app.Workbooks.Add(
Excel.XlWBATemplate.xlWBATWorkSheet);
app.Visible = true;
app.UserControl = true;
}
catch (Exception) {
Console.WriteLine("Error creating Excel
application!");
}
}
TlbImp 결과 사용자 지정

명령줄 옵션




/sysarray
/namespace
/asmversion
ILDASM 및 ILASM 사용




사용하지 않은 형식을 제거합니다.
성공 HRESULT를 위해 PreserveSig를 설정합니다.
참조를 배열로 변경합니다.
매개 변수를 IntPtr로 변경합니다.
Primary Interop Assembly





COM 형식 라이브러리의 표준 관리된 정의
COM 구성 요소의 공급업체에서 제공합니다.
강력한 이름으로 제작(구성) 되어야 합니다.
/primary Tlbimp 명령줄 옵션
Regasm을 사용하여 등록합니다.
Interop 어셈블리 설치


PIA는 TLB 게시자가 제공해야 합니다. 또한 전역
어셈블리 캐시 (GAC)에 설치됩니다.
Interop 어셈블리는 런타임에서 확인할 수 있어야
합니다.


응용 프로그램 디렉터리에 설치됩니다.
 어셈블리와 기타 응용 프로그램 파일을 복사합니다.
전역 어셈블리 캐시에 설치됩니다.
 TlbImp를 사용하여 어셈블리를 서명합니다.
 TLBIMP MyLib.tlb /keyfile:MyKey.snk
 다음을 사용하여 GAC를 설치합니다.
 GACUTIL /i:MyLib.dll
스레딩 문제

관리된 스레드는 MTA 스레드로 초기화됩니다.



그래서 아파트 스레드 개체는 프록시를 통해
액세스합니다.
자유 스레드 개체는 직접 액세스합니다.
MTA 스레드 대신 STA 스레드를 사용하여
프록시를 방지합니다.


Windows Form 응용 프로그램 – 응용 프로그램
진입점에서 STAThread 속성을 사용합니다.
웹 응용 프로그램 – 페이지 지시문에서 ASPCompat =
True로 설정합니다.
유념해야 할 사항





STA 스레드를 사용하여 STA 구성 요소와
통신합니다.
너무 많은 호출을 방지하기 위해 캐싱을
사용합니다.
COM 개체를 해제하기 위해
Marshal.ReleaseComObject를 사용합니다.
COM 서버에 대해 가능하면 PIA를 사용하는 것이
좋습니다.
COM Interop의 목표는 기존 기능에 대한
액세스를 제공하는 것입니다.
COM에서 .NET으로의 상호 운용성
공통 언어 런타임
IUnknown
COM 클라이언트
IDispatch
COM IMyInterface
호출 가능
래퍼
카운팅되는
참조
IMyInterface
클라이언트
개체
추적된
참조
COM에서 .NET 개체를 사용하는
이유

관리되지 않는 클라이언트/호스트가 매우
많습니다.






Internet Explorer
Office XP
Windows shell
Visual Basic® 6.0
관리되지 않는 호스트의 관리된 개체는 Interop를
사용합니다.
.NET 개체는 관리된 클라이언트 및 관리되지 않는
클라이언트 모두에서 쉽게 호스트할 수 있습니다.
.NET 개체를 COM으로 노출하는
방법
관리된 클래스를 작성합니다.
2. TlbExp를 사용하여 형식 라이브러리를 만듭니다.
3. RegAsm을 사용하여 형식을 등록합니다.
또는
1. 관리된 클래스를 작성합니다.
2. Visual Studio 프로젝트 설정에서 “COM 등록”을
확인 표시합니다.
1.
COM 개발의 간편성


관리된 코드는 COM 개체를 가장 간단히 작성할
수 있는 방법입니다.
관리된 모든 개체는 COM 개체입니다.





클래스 팩터리가 있습니다.
형식 라이브러리가 있습니다.
Iunknown을 구현합니다.
Idispatch를 구현합니다.
CoCreatable이기도 합니다.
특정 제한

공통 언어 런타임의 모든 기능이 COM에 모두
노출될 수 있는 것은 아닙니다.




정적 (공유) 메서드는 노출되지 않습니다.
매개 변수를 가진 생성자도 노출되지 않습니다.
오버로드된 메서드의 이름은 변경됩니다.
상속 계층이 결합됩니다.
상호 운용성을 위한 설계

제한






공개 데이터 형식만 노출됩니다.
공개 구성원만 노출됩니다.
공유/정적 구성원은 액세스할 수 없습니다.
오버로드된 구성원의 이름이 변경됩니다.
만들 수 있는 클래스에 공개 기본 생성자가 필요합니다.
최상의 방법


인터페이스를 통해 공통 기능을 노출합니다.
사용자 지정 속성을 사용하여 형식을 사용자 지정합니다.
형식 라이브러리 및 등록

Visual Studio를 사용하여 등록할 수 있습니다.




또는 직접 등록할 수 있습니다.


프로젝트/속성 페이지
구성 속성/빌드 페이지
“COM 상호 운용성 등록” 확인란에 확인 표시
TlbExp 및 RegAsm 유틸리티 사용
클라이언트 개발자 도구에서 TLB를 참조합니다.


Visual Basic 6.0의 프로젝트/참조
Microsoft Visual C++® 6.0의 #import
내보낸 서명 변환 예제
.NET 메서드 서명 :
int FormatDate(String s, DateTime d);
COM 메서드 서명
HRESULT FormatDate(BSTR s, DATE d,
[out, retval] int *retval);
형식 변환 정보









DATE
BSTR
Safearray(int)
OLECOLOR
DECIMAL
VARIANT
Interface
IMyInterface
Class CMyClass
IEnumVariant
System.DateTime
System.String
int[ ]
System.Drawing.Color
System.Decimal
System.Object
interface IMyInterface
coclass CMyClass
IEnumerator
클래스 인터페이스

클래스 구성원에 직접 바인딩하기 위해
선택적으로 만들어진 인터페이스





COM 클라이언트가 명시적 인터페이스 없이 클래스
구성원을 바인딩하도록 허용합니다.
인터페이스는 COM에서만 액세스할 수 있습니다.
인터페이스는 내보내는 시간에 자동으로 지정됩니다.
ClassInterfaceAttribute를 사용하여 원하는
클래스 인터페이스 동작을 선택합니다.
속성을 개별 클래스 또는 어셈블리 전체에
적용합니다.
클래스 인터페이스 형식

AutoDispatch (기본값)



None (권장)


형식 정보가 없는 Dispinterface
클라이언트가 DispIDs를 캐싱하지 않도록 합니다.
자체 인터페이스를 정의하고 구현합니다.
AutoDual



자동으로 생성된 이중 인터페이스
사용이 간편하지만 버전 문제가 있습니다.
Beta 1에서 기본값이었습니다.
활성화 순서
1) 클라이언트는 CLSID를
통과하는
CoCreateInstance를
호출합니다.
4) Mscoree.dll은 어셈블리
키를 사용하여 어셈블리의
위치를 찾고 어셈블리를
로드합니다.
2) CoCreateInstance는
CLSID에 대한 ClassFactory를
얻기 위해 Mscoree.dll의
DllGetClassObject 개체를
호출합니다.
5) 로드를 실패하면
Mscoree.dll은 Codebase
키를 사용하여 어셈블리의
위치를 찾고 어셈블리를
로드합니다.
3) Mscoree.dll은
레지스트리에서 어셈블리,
CodeBase 및 클래스 키를
읽습니다.
6) Mscoree.dll은 클래스
키를 사용하여 어셈블리의
클래스 위치를 찾습니다.
7) Mscoree.dll은 공용 기본
생성자를 위한 클래스를
확인합니다.
8) Mscoree.dll은 CLSID로
IClassFactory를
반환합니다.
9) CoCreateInstance는
IClassFactory.CreateInst
ance를 호출합니다.
10) 클래스 팩터리는 클래스
인스턴스를 만들고 요청된
인터페이스를 반환합니다.
개체 사용자 정의
상호 운용성을 향상시키기 위해

사용자 지정 속성은 형식의 노출 방법을
변경하는데 사용합니다.







ComVisibileAttribute
GuidAttribute
DispIdAttribute
ProgIdAttribute
InterfaceTypeAttribute
MarshalAsAttribute
ClassInterfaceAttribute
강력한 이름과 GUID


라이브러리, 클래스 및 인터페이스에 대해
자동으로 고정 GUID가 만들어집니다.
CLSID – 어셈블리의 강력한 이름과 클래스
이름의 조합에 따라 만들어집니다.



IID – 인터페이스 구성원에서 만들어집니다.


어셈블리의 강력한 이름이 변경되면 변경됩니다.
고유 CLSID에 대해 강력한 이름이 필요합니다.
인터페이스가 변경되면 변경됩니다.
Interop를 위해 강력한 명명을 권장합니다.
(Sn.exe 사용)
어셈블리 배치하기

어셈블리는 런타임에서 찾을 수 있도록 배치해야
합니다.



전역 어셈블리 캐시에 배치
 강력한 이름 필요
 GacUtil 또는 설치자를 사용하여 설치
 로딩 중에 정책이 적용됩니다.
응용 프로그램 디렉터리에 배치
 일반적으로 공유되지 않는 코드의 경우
 X 사본을 설치할 수 있습니다.
 로딩 중에 정책이 적용됩니다.
Codebase 키를 사용하여 참조한 위치에 배치
 로딩 중에 정책이 적용되지 않습니다.
리소스

SDK 설명서 : .NET Framework SDK의 “.NET
Framework를 사용한 프로그래밍”과 “관리되지 않는
코드와의 상호 운용성” 참조







SDK 예제 : C:\Program Files\...\
FrameworkSDK\Samples\technologies\interop\
뉴스그룹


.NET Framework에 COM 구성 요소 노출
관리되지 않는 DLL 기능 사용
상호 운용성을 위한 설계 고려 사항
고급 COM Interop
Interop 마샬링
microsoft.public.dotnet.framework.interop
서적

.NET and COM: The Complete Interoperability Guide

Sams; ISBN: 067232170X
Q&A



Visual Studio의 도구, 사용자 정의, COM 구성
요소 탭을 사용하여 관리된 래퍼 어셈블리를 만들
수 있습니까?
COM 개체가 예를 들면 size_is 및 BSTR*를
사용하는 배열과 같은 보다 복잡한 데이터를
반환하는 경우에도 .NET에서 COM을 호출할 수
있습니까?
Visual Studio .NET에서 TypeLib은 무엇입니까?
Q&A



COM과 COM을 사용할 때 COM interop를
사용하는 것이 더 느립니까?
클라이언트의 .NET 개체에서 COM 런타임 호출
가능 래퍼 사용과 COM 구성 요소 액세스 성능은
어떠합니까?
Microsoft Management Console에서 .NET
개체를 호출하는 문제와 관련하여 권장해 주실
사항이 있으십니까?
Q&A



COM interop 등록으로 .NET 구성 요소에
추가되는 것은 무엇입니까?
COM과 COM+를 명확하게 설명하는 짧고 간단한
리소스가 있으면 알려주시겠습니까?
COM+에서는 .NET 구성 요소를 어떻게 호스트할
수 있습니까?
Q&A



COM 구성 요소가 가비지 수집기를 사용할 수
있습니까?
.NET에서 처리하는 COM 구성 요소의 이진
호환성은 어떻습니까?
AutoDual 인터페이스를 보다 복잡하게 만들 수
있습니까?
Q&A



Windows XP에서 COM interop를 사용하려고
하는데, 차이점이 있습니까?
COM에서 볼 수 있는 클래스와 .NET에서 볼 수
있는 기타 클래스를 단일 프로젝트에 포함할 수
있습니까?
현재 COM 구성 요소를 결국 관리된 .NET 코드로
마이그레이션해야 합니까?
Q&A



interop에 대해 강력한 이름을 사용하지 않을
경우 어떠한 문제가 발생하는지 설명해
주시겠습니까?
현재의 COM 구성 요소를 결국에는 관리된 .NET
코드로 마이그레션해야 합니까?
.NET에서 DCOM 사용에 대해 특별히 고려해야
할 사항이 있습니까?
Q&A



.NET과 COM interop 가이드가 사용자 정의
인터페이스를 구현하는 ActiveX® 컨트롤에 직접
적용됩니까?
클라이언트가 COM으로 노출되는 원격 .NET
개체를 어떻게 확인합니까? 예를 들면, DCOM
개체를 어떻게 확인합니까?
처음부터 Visual C++를 사용하여 COM interop
래퍼를 만드는 문서화된 방법이 있습니까?
Q&A



폼 및 사용자 컨트롤과 같은 .NET UI 구성 요소를
관리되지 않는 ActiveX 컨트롤 컨테이너 안에
호스트할 수 있습니까?
프로세스 범위는 어디입니까? COM DLL을
호출된 .NET 구성 요소와는 다른 프로세스에서
호출합니까?
관리된 코드를 사용할 경우 보안성이 떨어집니까?
Q&A




COM interop를 사용하는 경우 관리되지 않는
모드에서 실행됩니까?
.NET에서 COM+ 구성 요소를 직접 사용하는 경우
관리된 코드를 사용합니까?
COM+ 서버 패키지의 COM DLL이 .NET 구성
요소를 호출하는 경우 프로세스 범위가
변경됩니까?
interop를 사용하지 않고 COM+에서 .NET 구성
요소를 호출할 수 있습니까?
오늘 Microsoft 기술 지원 웹캐스트(WebCast)를 경청해주신
여러분께 감사 드립니다.
향후 개발될 기술 지원 웹캐스트 (WebCast) 및 보관 컨텐츠
(스트리밍 미디어 파일, PowerPoint ® 슬라이드, 녹음 내용)
관련 정보를 원하시면 아래 웹사이트를 방문하시기 바랍니다.
http://support.microsoft.com/default.aspx?scid=
/directory/worldwide/ko/webcasts
저희는 여러분의 의견을 기다립니다.
기술 지원 웹캐스트(WebCast) 에 관한 의견이나 제안 사항을
[email protected] 로 보내주시기 바랍니다.

다음 문의 사항에 대한 여러분의 의견을
[email protected] 으로 보내 주십시오.
1.
기술 지원 웹캐스트(WebCast)의 내용이 도움이
되셨습니까?
2.
기술 지원 웹캐스트(WebCast)의 내용이 얼마나
유용했는지 말씀해 주십시오.

여러분의 소중한 의견은 웹캐스트(WebCast)
향상에 많은 도움이 될 것 입니다.
감사합니다.