COM 및 .NET의 C++ 특성

Microsoft는 COM 프로그래밍 및 .NET Framework 공용 언어 런타임 개발을 간소화하는 C++ 특성 집합을 정의합니다. 소스 파일에 특성을 포함하면 컴파일러는 공급자 DLL과 함께 작동하여 코드를 삽입하거나 생성된 개체 파일의 코드를 수정합니다. 이러한 특성은 .idl 파일, 인터페이스, 형식 라이브러리 및 기타 COM 요소를 만드는 데 도움이 됩니다. IDE(통합 개발 환경)에서 특성은 마법사 및 속성 창 의해 지원됩니다.

특성은 COM 개체를 작성하는 데 필요한 일부 세부 코딩을 제거하지만 COM 기본 사항에 대한 배경 지식이 필요합니다.

참고 항목

C++ 표준 특성을 찾으려면 특성을 참조 하세요.

특성의 용도

특성은 언어의 클래식 구조를 중단하지 않고는 현재 사용할 수 없는 방향으로 C++를 확장합니다. 특성을 사용하면 공급자(별도의 DLL)가 언어 기능을 동적으로 확장할 수 있습니다. 특성의 주요 목표는 구성 요소 개발자의 생산성 수준을 높이는 것 외에도 COM 구성 요소의 작성을 간소화하는 것입니다. 클래스, 데이터 멤버 또는 멤버 함수와 같은 거의 모든 C++ 구문에 특성을 적용할 수 있습니다. 다음은 이 새로운 기술에서 제공하는 이점의 하이라이트입니다.

  • 친숙하고 간단한 호출 규칙을 노출합니다.

  • 매크로와 달리 디버거에서 인식되는 삽입된 코드를 사용합니다.

  • 부담스러운 구현 세부 정보 없이 기본 클래스에서 쉽게 파생할 수 있습니다.

  • COM 구성 요소에 필요한 많은 양의 IDL 코드를 몇 가지 간결한 특성으로 바꿉니다.

예를 들어 제네릭 ATL 클래스에 대한 간단한 이벤트 싱크를 구현하려면 event_receiver 특성을 같은 특정 클래스CMyReceiver에 적용할 수 있습니다. event_receiver 그런 다음 Microsoft C++ 컴파일러에서 특성을 컴파일하여 개체 파일에 적절한 코드를 삽입합니다.

[event_receiver(com)]
class CMyReceiver
{
   void handler1(int i) { ... }
   void handler2(int i, float j) { ... }
}

그런 다음 메서드 handler1handler2CMyReceiver 설정하고 event_source 사용하여 만들 수 있는 이벤트 원본에서 이벤트(__hook 내장 함수 사용)를 처리할 수 있습니다.

특성의 기본 메커니즘

프로젝트에 특성을 삽입하는 세 가지 방법이 있습니다. 먼저 소스 코드에 수동으로 삽입할 수 있습니다. 둘째, 프로젝트에서 개체의 속성 표를 사용하여 삽입할 수 있습니다. 마지막으로 다양한 마법사를 사용하여 삽입할 수 있습니다. 속성 창 및 다양한 마법사 사용에 대한 자세한 내용은 Visual Studio 프로젝트 - C++를 참조하세요.

이전과 마찬가지로 프로젝트가 빌드되면 컴파일러는 각 C++ 소스 파일을 구문 분석하여 개체 파일을 생성합니다. 그러나 컴파일러에서 특성이 발견되면 구문 분석되고 구문적으로 확인됩니다. 그런 다음 컴파일러는 특성 공급자를 동적으로 호출하여 코드를 삽입하거나 컴파일 시간에 다른 수정을 합니다. 공급자의 구현은 특성 유형에 따라 다릅니다. 예를 들어 ATL 관련 특성은 Atlprov.dll에 의해 구현됩니다.

다음 그림에서는 컴파일러와 특성 공급자 간의 관계를 보여 줍니다.

Diagram showing component attribute communication.

참고 항목

특성 사용은 원본 파일의 내용을 변경하지 않습니다. 생성된 특성 코드가 표시되는 유일한 시간은 디버깅 세션 중입니다. 또한 프로젝트의 각 원본 파일에 대해 특성 대체 결과를 표시하는 텍스트 파일을 생성할 수 있습니다. 이 절차에 대한 자세한 내용은 (삽입된 코드 병합) 및 삽입된 코드 디버그를 참조/Fx하세요.

대부분의 C++ 구문과 마찬가지로 특성에는 적절한 사용을 정의하는 특성 집합이 있습니다. 이를 특성의 컨텍스트라고 하며 각 특성 참조 항목에 대한 특성 컨텍스트 테이블에서 해결됩니다. 예를 들어 coclass 특성은 C++ 소스 파일 내의 아무 곳에나 삽입할 수 있는 cpp_quote 특성과 달리 기존 클래스 또는 구조체에만 적용할 수 있습니다.

특성을 사용하는 프로그램 빌드

소스 코드에 Visual C++ 특성을 배치한 후 Microsoft C++ 컴파일러가 형식 라이브러리 및 .idl 파일을 생성하도록 할 수 있습니다. 다음 링커 옵션은 .tlb 및 .idl 파일을 빌드하는 데 도움이 됩니다.

일부 프로젝트에는 여러 개의 독립적인 .idl 파일이 포함되어 있습니다. 둘 이상의 .tlb 파일을 생성하고 필요에 따라 리소스 블록에 바인딩하는 데 사용됩니다. 이 시나리오는 현재 Visual C++에서 지원되지 않습니다.

또한 Visual C++ 링커는 모든 IDL 관련 특성 정보를 단일 MIDL 파일에 출력합니다. 단일 프로젝트에서 두 개의 형식 라이브러리를 생성할 수 있는 방법은 없습니다.

특성 컨텍스트

C++ 특성은 적용할 수 있는 대상(적용 대상), 반복 가능 여부(반복 가능), 다른 특성의 필수 존재(필수 특성) 및 다른 특성과의 비호환성(잘못된 특성)의 네 가지 기본 필드를 사용하여 설명할 수 있습니다. 이러한 필드는 각 특성의 참조 항목에 포함된 테이블에 나열됩니다. 이러한 각 필드는 아래에 설명되어 있습니다.

적용 대상

이 필드는 지정된 특성의 법적 대상인 다양한 C++ 언어 요소를 설명합니다. 예를 들어 특성이 적용 대상 필드에서 "클래스"를 지정하는 경우 이 특성은 법적 C++ 클래스에만 적용할 수 있음을 나타냅니다. 특성이 클래스의 멤버 함수에 적용되는 경우 구문 오류가 발생합니다.

자세한 내용은 사용량별 특성을 참조 하세요.

반복 가능

이 필드는 특성을 동일한 대상에 반복적으로 적용할 수 있는지 여부를 표시합니다. 대부분의 특성은 반복할 수 없습니다.

필수 특성

이 필드에는 지정된 특성이 제대로 작동하기 위해 존재해야 하는 다른 특성(즉, 동일한 대상에 적용됨)이 나열됩니다. 특성에 이 필드에 대한 항목이 있는 것은 드문 일입니다.

잘못된 특성

이 필드에는 지정된 특성과 호환되지 않는 다른 특성이 나열됩니다. 특성에 이 필드에 대한 항목이 있는 것은 드문 일입니다.

삽입한 코드 디버그

특성을 사용하면 C++ 프로그래밍을 매우 단순화할 수 있습니다. 자세한 내용은 개념을 참조하세요. 일부 특성은 컴파일러가 직접 해석합니다. 프로그램 소스에 코드를 삽입하여 컴파일러가 컴파일할 수 있게 하는 특성도 있습니다. 이렇게 코드를 삽입하면 프로그래머가 써야 하는 코드의 양이 줄어들어 보다 쉽게 프로그래밍할 수 있습니다. 그러나 때때로 버그가 발생하여 삽입된 코드를 실행하는 동안 애플리케이션에 문제가 생기기도 합니다. 이런 경우에는 삽입된 코드를 볼 수 있습니다. Visual Studio에서는 두 가지 방법으로 삽입된 코드를 볼 수 있습니다.

  • 디스어셈블리 창에서 삽입된 코드를 볼 수 있습니다.

  • /Fx를 사용하여 원래 코드와 삽입된 코드가 병합된 원본 파일을 만들 수 있습니다.

디스어셈블리 창에는 소스 코드와 특성에 의해 삽입된 코드에 대한 어셈블리 언어 명령이 표시됩니다. 또한 디스어셈블리 창에 소스 코드 주석이 표시될 수도 있습니다.

소스 주석을 설정하려면

  • 디스어셈블리 창에서 마우스 오른쪽 단추를 클릭하고 바로 가기 메뉴에서 소스 코드 표시를 선택합니다.

    소스 창에 있는 특성의 위치를 알면 바로 가기 메뉴를 사용하여 디스어셈블리 창에서 삽입된 코드를 찾을 수 있습니다.

삽입된 코드를 보려면

  1. 디버거는 중단 모드에 있어야 합니다.

  2. 소스 코드 창에서 보려는 삽입된 코드의 특성 앞에 커서를 놓습니다.

  3. 마우스 오른쪽 단추를 클릭하여 바로 가기 메뉴에서 디스어셈블리로 이동을 선택합니다.

    특성이 현재 실행 위치와 가까이 있으면 디버그 메뉴에서 디스어셈블리 창을 선택할 수 있습니다.

현재 실행 위치에서 디스어셈블리 코드를 보려면

  1. 디버거는 중단 모드에 있어야 합니다.

  2. 디버그 메뉴에서 을 선택하고 디스어셈블리를 클릭합니다.

섹션 내용

특성 프로그래밍 FAQ
그룹별 특성
용도별 특성
특성 사전순 참조