메타데이터(CLI)
Metadata (CLI)파일 이름 확장자 | .exe ,.dll ,.winmd |
---|---|
매직 넘버 | 0x424A5342 |
개발자 | Microsoft, Ecma International |
표준. | ECMA-335 파트 II |
Common Language Infrastructure(CLI; 공통 언어 인프라스트럭처)의 메타데이터는 공통 중간 언어(CIL) 코드에 내장된 특정 데이터 구조를 말하며, 코드의 개략적인 구조를 나타냅니다.메타데이터는 어셈블리에 정의된 모든 클래스 및 클래스 멤버 및 현재 어셈블리가 다른 어셈블리에서 호출하는 클래스 및 클래스 멤버를 나타냅니다.메서드의 메타데이터에는 클래스(및 클래스를 포함하는 어셈블리), 반환 유형 및 모든 메서드 매개 변수 등 메서드의 전체 설명이 포함됩니다.
CLI 언어 컴파일러는 메타데이터를 생성하여 CIL을 포함하는 어셈블리에 저장합니다.런타임에 CIL이 실행되면 착신 메서드의 메타데이터가 호출 메서드에 저장되어 있는 메타데이터와 동일한지 확인합니다.따라서 메서드는 정확한 파라미터 수와 정확한 파라미터 유형으로만 호출할 수 있습니다.
Windows 8 및 Windows Phone 8에 있는 Windows Runtime 응용 프로그램플랫폼에서는 CLI 메타데이터 형식을 사용하여 지원되는 프로그래밍 언어로 기술된 코드의 컴포넌트인터페이스를 기술합니다.공통 언어 런타임에서의 사용 방법의 차이점은 어셈블리에 CIL [1]명령이 포함되어 있지 않다는 것입니다.
특성
개발자는 속성을 통해 코드에 메타데이터를 추가할 수 있습니다.속성에는 커스텀과 의사 커스텀의 두 가지 타입이 있으며 개발자에게는 동일한 구문이 있습니다.코드의 속성은 메타데이터를 생성하기 위해 컴파일러에 보내는 메시지입니다.CIL에서는 상속 수식자, 스코프 수식자 및 opcode 또는 스트림 이외의 거의 모든 메타데이터를 속성이라고도 합니다.
커스텀 아트리뷰트는 에서 상속되는 일반 클래스입니다.Attribute
class. 사용자 지정 속성은 다음 구문을 사용하여 메서드, 속성, 클래스 또는 전체 어셈블리에 사용할 수 있습니다.[AttributeName(optional parameter, optional name=value pairs)]
예를 들어 다음과 같습니다.
[커스텀] [커스텀 (1)] [커스텀(1, Comment='yes')]
커스텀 어트리뷰트는 CLI에서 광범위하게 사용됩니다.Windows Communication Framework는 속성을 사용하여 서비스 계약인 ASP를 정의합니다.NET은 이러한 메서드를 웹 서비스로 노출하기 위해 사용합니다. LINQ to SQL은 이러한 메서드를 사용하여 기본 관계 스키마에 대한 클래스 매핑을 정의합니다. Visual Studio는 이러한 메서드를 사용하여 개체의 속성을 그룹화하고 클래스 개발자는 이러한 메서드를 적용하여 개체의 클래스에 대한 범주를 표시합니다.[Category]
커스텀 어트리뷰트커스텀 어트리뷰트는 CLR이 아닌 어플리케이션코드로 해석됩니다.컴파일러는 커스텀애트리뷰트를 검출하면 CLR에 의해 인식되지 않는 커스텀메타데이터를 생성합니다.개발자는 메타데이터를 읽고 그에 대한 조치를 취하기 위한 코드를 제공해야 합니다.예를 들어, 이 예에 나타난 Atribut은 코드로 처리할 수 있습니다.
학급 커스텀 어트리뷰트 : 기여하다 { 사적인 인트 param Number(파라미터 번호) = 0; 사적인 스트링 댓글 = ""; 일반의 커스텀 어트리뷰트() { } 일반의 커스텀 어트리뷰트(인트 숫자) { param Number(파라미터 번호) = 숫자; } 일반의 스트링 댓글 { 세트 { 댓글 = 가치; } } }
클래스 이름은 속성 이름에 매핑됩니다.Visual C# 컴파일러는 자동으로 문자열을 추가합니다.Attribute
"는 임의의 속성명의 끝에 있습니다.따라서 모든 Atribute 클래스 이름은 이 문자열로 끝나야 합니다.다만, Atribute를 정의하려면 , 다음의 명령어를 사용합니다.Attribute
- - - 。항목에 속성을 붙일 때 컴파일러는 리터럴 이름과 이름을 모두 찾습니다.Attribute
마지막에 추가한다. 예를 들어, 만약 당신이 글을 쓴다면[Custom]
컴파일러는 양쪽 모두를 찾습니다.Custom
그리고.CustomAttribute
둘 다 존재하는 경우 컴파일러는 실패합니다.속성 앞에 "를 붙일 수 있습니다.@
애매한 위험을 감수하고 싶지 않다면[@Custom]
일치하지 않음CustomAttribute
. 속성을 사용하면 클래스의 생성자가 호출됩니다.오버로드된 컨스트럭터가 지원됩니다.이름-값 쌍은 속성에 매핑되고 이름은 속성의 이름을 나타내며 제공된 값은 속성에 의해 설정됩니다.
Atribute를 부가하는 것에 관해서 애매한 부분이 있는 경우가 있습니다.다음 코드를 고려합니다.
[오렌지] 일반의 인트 예: 방법(스트링 입력) { //본문이 여기로 이동합니다. }
주황색으로 표시된 것은 무엇입니까?그거는?ExampleMethod
반품가액, 또는 어셈블리 전체?이 경우 컴파일러는 디폴트로 Atribute를 메서드에 부가한 것으로 취급합니다.이것이 의도한 바가 아니거나 작성자가 코드를 명확히 하고 싶은 경우 속성 타깃을 지정할 수 있습니다.쓰기[return: Orange]
반환값이 주황색으로 표시됩니다.[assembly: Orange]
전체 어셈블리를 표시합니다.유효한 타깃은 다음과 같습니다.assembly
,field
,event
,method
,module
,param
,property
,return
그리고.type
.
의사 커스텀 어트리뷰트는 일반 커스텀어트리뷰트와 마찬가지로 사용되지만 커스텀핸들러는 없습니다.대신 컴파일러는 어트리뷰트에 대한 본질적인 인식을 가지고 있으며 이러한 어트리뷰트로 마크된 코드를 다르게 처리합니다.다음과 같은 속성Serializable
그리고.Obsolete
는 의사 커스텀아트리뷰트로서 실장됩니다.유사 커스텀 어트리뷰트는 메타데이터를 [clarification needed]기술하기에 충분한 구문을 가지고 있기 때문에 ILASm에서는 사용하지 마십시오.
메타데이터 스토리지
어셈블리에는 메타데이터 테이블이 포함되어 있습니다.이들 테이블은 CIL 사양으로 설명되어 있습니다.메타데이터 테이블에는 0개 이상의 엔트리가 있으며 엔트리의 위치에 따라 인덱스가 결정됩니다.CIL 코드가 메타데이터를 사용하는 경우 메타데이터 토큰을 통해 사용됩니다.이것은 32비트 값입니다.상위 8비트는 적절한 메타데이터 테이블을 식별하고 나머지 24비트는 테이블 내의 메타데이터 인덱스를 제공합니다.Framework SDK에는 다음과 같은 샘플이 포함되어 있습니다.metainfo
어셈블리의 메타데이터 테이블을 나열하지만, 이 정보는 개발자가 거의 사용하지 않습니다.어셈블리의 메타데이터는 에서 제공하는 ILDASM 도구를 사용하여 표시할 수 있습니다.NET Framework SDK.
CIL 표준에서 메타데이터는 ILASm(어셈블리 언어), 스토리지용 온디스크 표현 양식 및 Portable Executable(PE, .exe 또는 .dll) 형식의 어셈블리에 포함된 형식으로 정의됩니다.PE 폼은 온디스크 폼을 기반으로 합니다.
반사
Reflection은 CLI 메타데이터를 읽기 위해 사용되는 API입니다.리플렉션 API는 metainfo와 같은 도구에서 제공하는 리터럴 뷰가 아닌 메타데이터의 논리적 뷰를 제공합니다.의 버전 1.1에서의 리플렉션.NET 프레임워크를 사용하여 클래스 및 해당 멤버의 설명을 검사하고 메서드를 호출할 수 있습니다.단, 메서드의 CIL에 대한 런타임접근은 허용되지 않습니다.프레임워크 버전 2.0에서는 메서드의 CIL을 얻을 수 있습니다.
기타 메타데이터 도구
그 외에System.Reflection
네임스페이스, 메타데이터를 처리하는 데 사용할 수 있는 다른 도구도 사용할 수 있습니다.Microsoft 。NET Framework는 네이티브코드로 구현된 CLR 메타데이터 조작 라이브러리를 제공합니다.메타데이터를 검색하고 조작하는 서드파티 툴에는 Post Sharp 및 Mono Cecil도 사용할 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "Windows Metadata (WinMD) files". Windows UWP applications.