다음을 통해 공유


RPC NDR 형식 문자열

NDR 엔진: 32비트 인터프리터

이 문서에서는 32비트 NDR 엔진의 형식 문자열 설명자(MOP라고도 함)에 대해 설명합니다. 이 섹션에서는 –Oi 인터프리터에서 – Oif 인터프리터 계층으로의 진화와 관련된 변경 내용과 파이프 및 비동기 지원과 관련된 추가 사항에 대해 설명합니다.

이 문서에서는 엔진 관점에서 현재 MIDL(Microsoft Interface Definition Language) 기술과 현재 NDR 엔진에 대해 설명합니다.

개요

NDR 엔진은 RPC(원격 프로시저 호출) 및 DCOM 구성 요소의 마샬링 엔진입니다. 원격 호출의 모든 스텁 관련 문제를 처리합니다. 프로세스로서 NDR 마샬링은 MIDL 생성 스텁, MIDL JIT 형식 생성기 또는 다른 도구에서 생성되거나 수동으로 작성된 스텁의 C 코드에 의해 구동됩니다. 따라서 NDR 엔진은 특정 전송과 통신하는 기본 런타임(DCOM 또는 RPC)을 구동합니다.

디자인의 원래 목표는 MIDL 컴파일러에서 제공하는 정보를 기반으로 임의 데이터에 대한 효과적인 마샬링을 위한 도구를 제공하는 것이었습니다. 이 문서에 설명된 형식 문자열과 실제로 NDR 엔진 사용을 위해 컴파일러에서 생성된 모든 정보는 항상 컴파일러와 엔진 간의 내부 인터페이스로 간주되어 왔습니다. 마찬가지로 런타임 문제를 처리하기 위해 엔진에서 사용할 수 있는 인터페이스도 대부분 내부입니다(RPC 런타임 쪽에 일부 예외가 있고 엔진에서 사용하는 일부 DCOM 인터페이스는 외부임).

마샬링에 대한 두 가지 일반적인 접근 방식은 항상 인라인 및 데이터 기반(해석된) 기술이었습니다. MIDL은 C에서 생성된 스텁의 –Os–Oi* 스위치를 통해 둘 다 지원합니다. 또한 MIDL은 oleautomation 패키지에서 사용하는 TLB 라이브러리를 생성할 수 있습니다. 따라서 엔진 내부의 한 가지 관점은 두 부분으로 구성된다는 것입니다.

첫 번째는 구조체 또는 배열과 같은 일반적인 데이터 형식 개체에 해당하는 크기 조정, 마샬링 등을 처리하는 루틴 집합입니다. 이러한 루틴은 성능을 위해 미세 조정됩니다. 예를 들어 일반적으로 가능한 경우 데이터를 차단하려고 시도합니다. 이 부분을 핵심 NDR 엔진이라고도 합니다.

두 번째 부분은 인터프리터와 관련 부분으로 구성됩니다. 인터프리터는 내부 라이브러리에서처럼 핵심 NDR 엔진의 루틴을 사용하여 모든 인수가 마샬링되고 마샬링되지 않은 원격 호출을 적절하게 실행합니다.

핵심 NDR 엔진은 인라인 스텁에서 사용하든 인터프리터에서 사용하든 비슷한 방식으로 사용됩니다. 모든 핵심 엔진 루틴은 스텁 메시지 구조에 의해 전달된 상태에 따라 달라집니다. 구조체는 인라인 스텁 또는 인터프리터에 의해 적절하게 설정됩니다. 수년에 걸쳐 핵심 엔진은 다른 컨텍스트에서 사용되었습니다. 현재 인터프리터는 실제로 여러 개의 고유한 인터프리터 루프 집합입니다. 이는 이전 및 신규(–Oi–Oif) 인터프리터뿐만 아니라 데이터 직렬화(피클링), RPC 비동기 지원 및 DCOM 비동기 지원과 관련된 루프와 관련이 있습니다(RPC 및 DCOM에는 다른 비동기 프로그래밍 모델이 있음).

새로운 기능을 추가하는 것 외에도 NDR 엔진 진화의 중요한 측면은 인터프리터에 대한 접근 방식의 일반적인 변화입니다. NDR 버전 1.1은 마샬링에 대한 새로운 MIDL 2.0 접근 방식의 일부로 시작했으며, 성능 고려 사항에는 인라인 스텁이 선호됩니다. 최신 버전의 NDR에서 –Oif 는 인라인 스텁을 거의 제외할 정도로 컴파일러의 가장 널리 사용되는 모드가 되었습니다.

RPC NDR 엔진 형식 문자열 설명자는 다음 topics 자세히 설명합니다.