형식 시스템(C++/CX)Type System (C++/CX)

Windows 런타임 아키텍처를 사용 하 여 c + +/CX, Visual Basic, Visual c # 및 JavaScript를 사용 하 여 Windows API에 직접 액세스 하 고 다른 Windows 런타임 앱 및 구성 요소와 상호 운용할 수 있는 앱 및 구성 요소를 작성할 수 있습니다.By using the Windows Runtime architecture, you can use C++/CX, Visual Basic, Visual C# and JavaScript to write apps and components that directly access the Windows API and interoperate with other Windows Runtime apps and components. C + +로 작성 된 앱 유니버설 Windows 플랫폼 CPU에서 직접 실행 되는 네이티브 코드로 컴파일됩니다.Universal Windows Platform apps that are written in C++ compile to native code that executes directly in the CPU. C #으로 작성 되거나 Visual Basic MSIL (Microsoft 중간 언어)로 컴파일되고 CLR (공용 언어 런타임)에서 실행 되는 앱을 유니버설 Windows 플랫폼 합니다.Universal Windows Platform apps that are written in C# or Visual Basic compile to Microsoft intermediate language (MSIL) and execute in the common language runtime (CLR). JavaScript로 작성 된 유니버설 Windows 플랫폼 앱은 런타임 환경에서 실행 됩니다.Universal Windows Platform apps that are written in JavaScript execute in a run-time environment. Windows 런타임 운영 체제 구성 요소 자체는 c + +로 작성 되 고 네이티브 코드로 실행 됩니다.The Windows Runtime operating system components themselves are written in C++ and run as native code. 이러한 모든 구성 요소 및 유니버설 Windows 플랫폼 앱은 ABI (Windows 런타임 응용 프로그램 이진 인터페이스)를 통해 직접 통신 합니다.All of these components and Universal Windows Platform apps communicate directly through the Windows Runtime application binary interface (ABI).

최신 c + +에서 Windows 런타임에 대 한 지원을 사용 하도록 설정 하기 위해 Microsoft는 c + +/CX를 만들었습니다.To enable support for the Windows Runtime in a modern C++ idiom, Microsoft created the C++/CX. C + +/CX는 c + + 앱 및 구성 요소가 ABI에서 다른 언어로 작성 된 앱과 통신할 수 있도록 하는 기본 Windows 런타임 형식의 구현 및 기본 제공 기본 형식을 제공 합니다.C++/CX provides built-in base types and implementations of fundamental Windows Runtime types that enable C++ apps and components to communicate across the ABI with apps that are written in other languages. 모든 Windows 런타임 형식을 사용 하거나 클래스, 구조체, 인터페이스 및 다른 유니버설 Windows 플랫폼 앱 및 구성 요소에서 사용할 수 있는 기타 사용자 정의 형식을 만들 수 있습니다.You can consume any Windows Runtime type, or create classes, structs, interfaces, and other user-defined types that can be consumed by other Universal Windows Platform apps and components. c + +/CX로 작성 된 유니버설 Windows 플랫폼 앱은 공용 액세스 가능성이 없는 한 일반 c + + 클래스 및 구조체를 사용할 수도 있습니다.a Universal Windows Platform app that's written in C++/CX can also use regular C++ classes and structs as long as they don't have public accessibility.

C++/CX 언어 프로젝션 및 작동 방법에 대한 자세한 내용은 다음 블로그 게시물을 참조하세요.For an in-depth discussion of the C++/CX language projection and how it works under the covers, see these blog posts:

Windows 메타데이터(.winmd) 파일Windows metadata (.winmd) files

C + +로 작성 된 유니버설 Windows 플랫폼 앱을 컴파일하는 경우 컴파일러는 네이티브 기계어 코드에서 실행 파일을 생성 하 고 클래스, 구조체, 열거형, 인터페이스, 매개 변수가 있는 인터페이스 및 대리자를 포함 하 여 공용 Windows 런타임 형식에 대 한 설명을 포함 하는 별도의 Windows 메타 데이터 (winmd) 파일을 생성 합니다.When you compile a Universal Windows Platform app that's written in C++, the compiler generates the executable in native machine code, and also generates a separate Windows metadata (.winmd) file that contains descriptions of the public Windows Runtime types, which include classes, structs, enumerations, interfaces, parameterized interfaces, and delegates. 메타데이터의 형식은 .NET Framework 어셈블리에 사용된 형식과 유사합니다.The format of the metadata resembles the format that's used in .NET Framework assemblies. C++ 구성 요소에서 .winmd 파일은 메타데이터만 포함합니다. 실행 코드는 별도의 파일에 상주합니다.In a C++ component, the .winmd file contains only metadata; the executable code resides in a separate file. 이는 Windows에 포함 된 Windows 런타임 구성 요소에 대 한 사례입니다.This is the case for the Windows Runtime components that are included with Windows. WinMD 파일 이름은 소스 코드의 루트 네임스페이스의 접두사와 일치하거나 그 접두사여야 합니다.The WinMD file name must match or be a prefix of the root namespace in the source code. .NET Framework 언어의 경우 .winmd 파일에는 .NET Framework 어셈블리와 마찬가지로 코드와 메타데이터가 둘 다 포함됩니다.(For .NET Framework languages, the .winmd file contains both the code and the metadata, just like a .NET Framework assembly.)

.winmd 파일의 메타데이터는 코드의 게시된 표면을 나타냅니다.The metadata in the .winmd file represents the published surface of your code. 게시 된 유형은 다른 앱이 작성 된 언어에 관계 없이 다른 유니버설 Windows 플랫폼에 표시 됩니다.Published types are visible to other Universal Windows Platforms no matter what language those other apps are written in. 따라서 메타 데이터 또는 게시 된 코드는 Windows 런타임 형식 시스템에서 지정한 형식만 포함할 수 있습니다.Therefore, the metadata, or your published code, can only contain types specified by the Windows Runtime type system. 일반 클래스, 배열, 템플릿 또는 STL 컨테이너와 같은 C++에 특정한 언어 구문은 메타데이터에 게시할 수 없습니다. Javascript 또는 C# 클라이언트 앱은 이러한 언어 구문으로 수행할 작업을 인식하지 못하기 때문입니다.Language constructs that are specific to C++, such as regular classes, arrays, templates or STL containers, cannot be published in metadata because a Javascript or C# client app would not know what to do with them.

메타데이터에 형식이 표시되는지, 메서드가 표시되는지는 적용된 액세스 가능성 한정자에 따라 결정됩니다.Whether a type or method is visible in metadata depends on what accessibility modifiers are applied to it. 표시하려면 네임스페이스에 public으로 형식을 선언해야 합니다.To be visible, a type must be declared in a namespace and must be declared as public. public이 아닌 ref 클래스는 코드의 내부 도우미 형식으로 허용되고, 메타데이터에 표시되지는 않습니다.A non-public ref class is permitted as an internal helper type in your code; it just isn't visible in the metadata. public ref 클래스의 경우에도 일부 멤버만 표시하면 됩니다.Even in a public ref class, not all members are necessarily visible. 다음 표에서는 public ref 클래스의 c + + 액세스 지정자와 메타 데이터 표시 유형 간의 관계를 나열 Windows 런타임 합니다.The following table lists the relationship between C++ access specifiers in a public ref class, and Windows Runtime metadata visibility:

메타데이터에 게시됨Published in metadata 메타데이터에 게시되지 않음Not published in metadata
공공public privateprivate
protectedprotected internalinternal
public protectedpublic protected private protectedprivate protected

개체 브라우저 를 사용하여 .winmd 파일의 내용을 볼 수 있습니다.You can use the Object Browser to view the contents of .winmd files. Windows에 포함 된 Windows 런타임 구성 요소는 Windows winmd 파일에 있습니다.The Windows Runtime components that are included with Windows are in the Windows.winmd file. 기본 winmd 파일에는 c + +/CX에 사용 되는 기본 형식이 포함 되어 있으며, platform은 Platform 네임 스페이스의 추가 형식을 포함 합니다.The default.winmd file contains the fundamental types that are used in C++/CX, and platform.winmd contains additional types from the Platform namespace. 기본적으로 이러한 3 개의 winmd 파일은 유니버설 Windows 플랫폼 앱에 대 한 모든 c + + 프로젝트에 포함 되어 있습니다.By default, these three .winmd files are included in every C++ project for Universal Windows Platform apps.

Platform::Collections Namespace 의 형식은 public이 아니므로 .winmd 파일에 표시되지 않습니다.The types in the Platform::Collections Namespace don't appear in the .winmd file because they are not public. 이는 Windows::Foundation::Collections에 정의된 인터페이스의 private C++ 관련 구현입니다.They are private C++-specific implementations of the interfaces that are defined in Windows::Foundation::Collections. JavaScript 또는 c #으로 작성 된 Windows 런타임 앱은 Platform:: Collections:: Vector 클래스 는 무엇 인지 인식 하지 않지만를 사용할 수 있습니다 Windows::Foundation::Collections::IVector .A Windows Runtime app that's written in JavaScript or C# doesn't know what a Platform::Collections::Vector Class is, but it can consume a Windows::Foundation::Collections::IVector. Platform::Collections 형식은 collection.h에 정의됩니다.The Platform::Collections types are defined in collection.h.

C + +/CX의 Windows 런타임 형식 시스템Windows Runtime type system in C++/CX

다음 섹션에서는 Windows 런타임 형식 시스템의 주요 기능 및 c + +/CX에서 지원 되는 방법에 대해 설명 합니다.The following sections describe the major features of the Windows Runtime type system and how they are supported in C++/CX.

네임스페이스Namespaces

모든 Windows 런타임 형식은 네임 스페이스 내에 선언 되어야 합니다. Windows API 자체는 네임 스페이스로 구성 됩니다.All Windows Runtime types must be declared within a namespace; the Windows API itself is organized by namespaces. .winmd 파일은 루트 네임스페이스와 이름이 같아야 합니다.A .winmd file must have the same name that the root namespace has. 예를 들어 이름이 A.B.C.MyClass인 클래스는 이름이 A.winmd, A.B.winmd 또는 A.B.C.winmd인 메타데이터 파일에 정의된 경우에만 인스턴스화될 수 있습니다.For example, a class that's named A.B.C.MyClass can be instantiated only if it's defined in a metadata file that's named A.winmd or A.B.winmd or A.B.C.winmd. DLL의 이름은 .winmd 파일 이름과 일치하지 않아도 됩니다.The name of the DLL is not required to match the .winmd file name.

Windows API 자체는 네임스페이스로 구성된 효율적인 클래스 라이브러리로 다시 만들어졌습니다.The Windows API itself has been reinvented as a well-factored class library that's organized by namespaces. 모든 Windows 런타임 구성 요소는 Windows. * 네임 스페이스에 선언 됩니다.All Windows Runtime components are declared in the Windows.* namespaces.

자세한 내용은 네임 스페이스 및 형식 표시유형을 참조 하세요.For more information, see Namespaces and Type Visibility.

기본 형식Fundamental types

Windows 런타임은 UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean 및 String의 기본 형식을 정의 합니다.The Windows Runtime defines the following fundamental types, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Char16, Boolean, and String. C + +/CX는 기본 네임 스페이스에서 uint16, uint32, uint64, int16, int32, int64, float32, float64 및 char16 기본 숫자 형식을 지원 합니다.C++/CX supports the fundamental numeric types in its default namespace as uint16, uint32, uint64, int16, int32, int64, float32, float64, and char16. Boolean과 String은 둘 다 Platform 네임스페이스에 정의됩니다.Boolean and String are also defined in the Platform namespace.

또한 c + +/CX는 unsigned char Windows 런타임에서 지원 되지 않으며 공용 api에서 사용할 수 없는와 동일한 uint8를 정의 합니다.C++/CX also defines uint8, equivalent to unsigned char, which is not supported in the Windows Runtime and cannot be used in public APIs.

기본 형식을 Platform::IBox Interface 인터페이스에서 래핑하여 nullable로 만들 수 있습니다.A fundamental type may be made nullable by wrapping it in a Platform::IBox Interface interface. 자세한 내용은 값 클래스 및 구조체에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Value classes and structs.

기본 형식에 대한 자세한 내용은 기본 형식For more information about fundamental types, see Fundamental types

문자열Strings

Windows 런타임 문자열은 변경할 수 없는 16 비트 유니코드 문자 시퀀스입니다.A Windows Runtime string is an immutable sequence of 16-bit UNICODE characters. Windows 런타임 문자열은으로 프로젝션 됩니다 Platform::String^ .A Windows Runtime string is projected as Platform::String^. 이 클래스는 문자열 생성, 조작 및 변환을 위한 메서드를 제공 wchar_t 합니다.This class provides methods for string construction, manipulation, and conversion to and from wchar_t.

자세한 내용은 문자열에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Strings.

배열Arrays

Windows 런타임은 모든 형식의 1 차원 배열을 지원 합니다.The Windows Runtime supports 1-dimensional arrays of any type. 배열의 배열은 지원되지 않습니다.Arrays of arrays are not supported. C + +/CX에서는 Windows 런타임 배열을 Platform:: Array 클래스로프로젝션 합니다.In C++/CX, Windows Runtime arrays are projected as the Platform::Array Class.

자세한 내용은 Array 및 WriteOnlyArray 를 참조 하세요.For more information, see Array and WriteOnlyArray

Ref 클래스 및 구조체Ref classes and structs

Windows 런타임 클래스는 참조로 복사 되기 때문에 c + +/CX에서 ref 클래스 또는 ref 구조체로 프로젝션 됩니다.A Windows Runtime class is projected in C++/CX as a ref class or ref struct, because they are copied by reference. ref 클래스 및 ref 구조체의 메모리 관리는 참조 횟수에 따라 투명하게 처리됩니다.Memory management for ref classes and ref structs is handled transparently by means of reference counting. 개체에 대한 마지막 참조가 범위를 벗어나면 해당 개체가 삭제됩니다.When the last reference to an object goes out of scope, the object is destroyed. ref 클래스 또는 ref 구조체는 다음을 지원합니다.A ref class or ref struct can:

  • 멤버 생성자, 메서드, 속성 및 이벤트를 포함할 수 있습니다.Contain as members constructors, methods, properties, and events. 이러한 멤버는 액세스 가능성이 public, private, protected 또는 internal일 수 있습니다.These members can have public, private, protected, or internal accessibility.

  • private 중첩 열거형, 구조체 또는 클래스 정의를 포함할 수 있습니다.Can contain private nested enum, struct, or class definitions.

  • 기본 클래스에서 직접 상속될 수 있으며 원하는 수의 인터페이스를 구현할 수 있습니다.Can directly inherit from one base class and can implement any number of interfaces. 모든 ref 클래스는 암시적으로 Platform::Object Class 로 변환될 수 있으며, Object::ToString과 같은 가상 메서드를 재정의할 수 있습니다.All ref classes are implicitly convertible to the Platform::Object Class and can override its virtual methods—for example, Object::ToString.

public 생성자가 있는 ref 클래스는 추가 파생을 방지하기 위해 sealed로 선언해야 합니다.A ref class that has a public constructor must be declared as sealed, to prevent further derivation.

자세한 내용은 Ref 클래스 및 구조체For more information, see Ref classes and structs

값 클래스 및 구조체Value classes and structs

값 클래스 또는 값 구조체는 기본 데이터 구조를 나타내며 값 클래스, 값 구조체 또는 Platform::String^형식일 수 있는 필드만 포함합니다.A value class or value struct represents a basic data structure and contains only fields, which may be value classes, value structs, or type Platform::String^. 값 구조체 및 값 클래스는 값으로 복사됩니다.Value structs and value classes are copied by value.

값 구조체를 IBox 인터페이스에서 래핑하여 nullable로 만들 수 있습니다.A value struct can be made nullable by wrapping in an IBox interface.

자세한 내용은 값 클래스 및 구조체에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Value classes and structs.

partial 클래스Partial classes

partial 클래스 기능을 사용하면 여러 파일에 대해 하나의 클래스를 정의할 수 있습니다.The partial class feature enables one class to be defined over multiple files. 이 클래스는 XAML 편집기와 같은 코드 생성 도구에서 사용자가 편집하는 파일을 건드리지 않고 하나의 파일을 수정할 수 있게 하는 데 주로 사용됩니다.It's used primarily to enable code-generation tools such as the XAML editor to modify one file without touching the file that you edit.

자세한 내용은 partial 클래스For more information, see Partial classes

속성Properties

속성은 모든 Windows 런타임 형식의 공용 데이터 멤버 이며, get/set 메서드 쌍으로 구현 됩니다.A property is a public data member of any Windows Runtime type and is implemented as a get/set method pair. 클라이언트 코드는 공용 필드인 것처럼 속성에 액세스합니다.Client code accesses a property as if it were a public field. 사용자 지정 get 또는 set 코드가 필요 없는 속성을 trivial 속성 이라고 하며, 명시적인 get 또는 set 메서드 없이 선언할 수 있습니다.A property that requires no custom get or set code is known as a trivial property and can be declared without explicit get or set methods.

자세한 내용은 속성에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Properties.

C + +/CX의 Windows 런타임 컬렉션Windows Runtime collections in C++/CX

Windows 런타임는 각 언어에서 자체적으로 구현 하는 컬렉션 형식에 대 한 인터페이스 집합을 정의 합니다.The Windows Runtime defines a set of interfaces for collection types that each language implements in its own way. C + +/CX는 platform:: collections:: Vector 클래스, Platform:: Collections:: MAP 클래스및 STL (표준 템플릿 라이브러리)과 호환 되는 기타 관련 구체적 컬렉션 형식에 대 한 구현을 제공 합니다.C++/CX provides implementations in the Platform::Collections::Vector Class, Platform::Collections::Map Class, and other related concrete collection types, which are compatible with their Standard Template Library (STL) counterparts.

자세한 내용은 컬렉션을 참조 하세요.For more information, see Collections.

템플릿 ref 클래스Template ref classes

private 및 internal ref 클래스는 템플릿으로 만들고 특수화할 수 있습니다.Private and internal ref classes can be templated and specialized.

자세한 내용은 템플릿 ref 클래스에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Template ref classes.

인터페이스Interfaces

Windows 런타임 인터페이스는 ref 클래스 또는 ref 구조체가 인터페이스에서 상속 된 경우에 구현 해야 하는 공용 속성, 메서드 및 이벤트 집합을 정의 합니다.A Windows Runtime interface defines a set of public properties, methods, and events that a ref class or ref struct must implement if it inherits from the interface.

자세한 내용은 인터페이스를 참조하세요.For more information, see Interfaces.

열거형Enums

Windows 런타임의 enum 클래스는 c + +의 범위가 지정 된 열거형과 비슷합니다.An enum class in Windows Runtime resembles a scoped enum in C++. 기본 형식은 int32입니다. 단, [Flags] 특성이 지정된 경우에는 기본 형식이 uint32입니다.The underlying type is int32, unless the [Flags] attribute is applied—in that case, the underlying type is uint32.

자세한 내용은 열거형에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Enums.

대리자Delegates

Windows 런타임의 대리자는 c + +의 std:: function 개체와 유사 합니다.A delegate in the Windows Runtime is analogous to a std::function object in C++. 호환되는 시그니처가 있는 클라이언트 제공 함수를 호출하는 데 사용되는 특별한 종류의 ref 클래스입니다.It's a special kind of ref class that's used to invoke client-provided functions that have compatible signatures. 대리자는 Windows 런타임에서 이벤트의 형식으로 가장 일반적으로 사용 됩니다.Delegates are most commonly used in the Windows Runtime as the type of an event.

자세한 내용은 대리자를 참조하세요.For more information, see Delegates.

예외Exceptions

C++/CX에서는 사용자 지정 예외 형식, std::exception 형식 및 Platform::Exception 형식을 catch할 수 있습니다.In C++/CX, you can catch custom exception types, std::exception types, and Platform::Exception types.

자세한 내용은 예외에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Exceptions.

이벤트Events

이벤트는 형식이 대리자 형식인 ref 클래스 또는 ref 구조체의 public 멤버입니다.An event is a public member in a ref class or ref struct whose type is a delegate type. 이벤트는 호출될 수만 있습니다. 즉, 소유 클래스에 의해서만 발생합니다.An event can only be invoked—that is, fired—by the owning class. 그러나 클라이언트 코드는 소유 클래스가 이벤트를 발생시킨 경우에 호출되는 이벤트 처리기라는 고유 함수를 제공할 수 있습니다.However, client code can provide its own functions, which are known as event handlers and are invoked when the owning class fires the event.

자세한 내용은 이벤트를 참조하세요.For more information, see Events.

캐스팅Casting

C++/CX에서는 표준 C++ 캐스트 연산자인 static_cast, dynamic_castreinterpret_cast와 C++/CX에서만 사용되는 safe_cast 연산자도 지원됩니다.C++/CX supports the standard C++ cast operators static_cast, dynamic_cast, and reinterpret_cast, and also the safe_cast operator that's specific to C++/CX.

자세한 내용은 캐스팅에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Casting.

boxingBoxing

boxed 변수는 참조 의미 체계가 필요한 경우 참조 형식에 래핑되는 값 형식입니다.A boxed variable is a value type that's wrapped in a reference type in situations where reference semantics are required.

자세한 내용은 boxing에 정의된 인터페이스의 private C++ 관련 구현입니다.For more information, see Boxing.

특성Attributes

특성은 모든 Windows 런타임 형식 또는 형식 멤버에 적용할 수 있고 런타임에 검사할 수 있는 메타 데이터 값입니다.An attribute is a metadata value that can be applied to any Windows Runtime type or type member and can be inspected at run time. Windows 런타임는 네임 스페이스의 공용 특성 집합을 정의 합니다 Windows::Foundation::Metadata .The Windows Runtime defines a set of common attributes in the Windows::Foundation::Metadata namespace. 공용 인터페이스의 사용자 정의 특성은이 릴리스의 Windows 런타임에서 지원 되지 않습니다.User-defined attributes on public interfaces are not supported by Windows Runtime in this release.

API 사용 중단API Deprecation

Windows 런타임 시스템 형식에서 사용 하는 것과 동일한 특성을 사용 하 여 공용 Api를 사용 하지 않는 것으로 표시 하는 방법을 설명 합니다.Describes how to mark public APIs as deprecated by using the same attribute that's used by the Windows Runtime system types.

자세한 내용은 사용 중단 types and members항목을 참조 하세요.For more information, see Deprecating types and members.

참고 항목See also

C + +/CX 언어 참조C++/CX Language Reference