2012-01-14 10 views
29

나는 여러 사이트를 검색하여 metadata이 .NET에 무엇이 있는지 이해했다..NET의 메타 데이터 란 무엇입니까?

저는 여전히 C# WPF 데스크톱 응용 프로그램 프로그래밍에 익숙합니다. 뒤로 웹 프로그래밍을 할 때, 제목, 키워드 등으로 사이트를 설명하는 메타 태그가 HTML 코드에 있습니다. .NET 응용 프로그램에서도 비슷합니다. 나는 위키를 읽고, 봤지만 나는 개념적 설명을 얻는다.

하나는 "metadata is data that describes the state of the assembly and a detailed description of each type, attribute within the assembly"입니다. 메타 데이터는 개념을 설명하는 코드이거나 코드를 설명하기 위해 입력 한 코드와 같은 물리적 인 것입니까? 그렇다면 내 추천은 내 메타 데이터가됩니까?

메타 데이터를 읽는 방법은 "Within the Common Language Runtime (CLR)"이지만, C#에서만 코드를 작성합니다. CLR에서 메타 데이터에 어떻게 코딩 할 수 있습니까? CLR에서 메타 데이터가 추천입니까? 어떻게 변경할 수 있습니까?

MSDN은을 이해하기 위해 다른 언어의 소프트웨어 구성 요소에 대한 이진 정보가 이라고 썼습니다. 나는 코드 블록이 무엇을 하는지를 이해하기 위해서만 영어로 사람이 설명 (추천) 할 필요가있다. 소프트웨어 구성 요소는 우리가 작성한 모든 문장을 실행합니다. "바이너리"정보의 필요성은 무엇입니까? 어떻게하면 컴파일러가 내 최상위 코드의 의미를 이해하여 "어셈블리 설명"을 생성 할 수 있습니까?? 통화를 변환하는 프로그램을 작성하면 프로그램을 아는 자동 생성 메타 데이터가 통화 변환 중입니까? 이 지능은 어디 있습니까?

나는 완전히 혼란 스럽다.

답변

15

을 가지고, 나는 당신이 메타 데이터를 직접 볼 수있는 방법 만 언급하겠습니다. 당신의 마이크로 소프트 SDK 디렉토리에서

( C의 대부분의 변화 : \ 프로그램 파일 \은 Microsoft SDKs \ 윈도우 \ v7.0A \ 빈 \으로 netfx 4.0 도구)라는 프로그램 ildasm.exe이있다 - 당신이 볼 수있는 간단한 디스어셈블러입니다 컴파일 된. NET 바이너리.

매우 간단한 콘솔 응용 프로그램을 빌드하고 ildasm.exe을 사용하여 컴파일 된 내용을 볼 수 있습니다. 보기/메타 정보/표시! 명령 (또는 간단하게 Ctrl + M)은 메타 데이터를 표시합니다. 어떻게 보이는지 확인할 수 있습니다. 인쇄 응용 프로그램 Hello에서 메타 데이터의 일부는 콘솔 :

TypeDef #1 (02000002) 
------------------------------------------------------- 
TypDefName: Program (02000002) 
Flags  : [Public] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit](00100001) 
Extends : 01000001 [TypeRef] System.Object 
Method #1 (06000001) [ENTRYPOINT] 
------------------------------------------------------- 
    MethodName: Main (06000001) 
    Flags  : [Public] [Static] [HideBySig] [ReuseSlot] (00000096) 
    RVA  : 0x00002050 
    ImplFlags : [IL] [Managed] (00000000) 
    CallCnvntn: [DEFAULT] 
    ReturnType: Void 
    1 Arguments 
     Argument #1: SZArray String 
    1 Parameters 
     (1) ParamToken : (08000001) Name : args flags: [none] (00000000) 

다음은 하나의 입력 인수를 void를 반환 유형 정의 (Program) 및 그 방법 중 하나 (Main)를 볼 수 있습니다. 이것은 자연스럽게 메타 데이터의 일부이며, 심지어 가장 단순한 프로그램의 경우에도 훨씬 더 많습니다.

+1

+1 다른 대답을 읽는 것이 이해가되고 혼란 스럽기 때문에 이것을 내 대답으로 받아 들여야합니다. – KMC

14

.NET Reflection에 익숙하다면 메타 데이터를 "Reflection이 액세스하는 데이터"라고 생각할 수 있습니다. 각 .NET 어셈블리에는 포함 된 형식 및 메서드, 해당 메서드의 특성 등에 대한 정보가 저장됩니다. 코드를 실행하기 위해 저장할 필요가 없습니다 (기본 EXE에는 이러한 종류의 정보가 없음). 그러나 선언적 보안을 강화하고 Reflection을 활성화하는 것과 같은 다른 목적을 위해 필요합니다.

그래서 메타 데이터는 "무언가 실제"이지만 대부분은 작성한 코드에서 자동 생성됩니다. 메타 데이터를 직접 변경할 수있는 유일한 방법은 클래스 또는 메서드에 특성을 추가하는 것일 수 있습니다. 특히, 소스 코드 주석은 메타 데이터로 (또는 다른 방법으로) 어셈블리에 저장되지 않습니다. 이에

위키 백과 페이지는 꽤 좋은 : http://en.wikipedia.org/wiki/.NET_metadata

편집 : 아니, 메타 데이터 주석처럼되지 않습니다. 그것은 단순히 "코드에 관한 데이터"이며, 이는 코드 자체의 일부가 아닙니다 (프로그램을 실행할 필요가 없습니다). 그것은 HTML 메타 데이터와 전혀 다릅니다. 메타 데이터의 예는 어셈블리에 "MyClass"라는 클래스가 있고 그 클래스에 특정 매개 변수 등이 포함 된 "DoSomething"이라는 메서드가 포함되어 있다는 것입니다. 따라서 신비한 것은 아닙니다. 주로 "명백한"것들입니다.

+0

을 refer--, 나는 혼란 스러워요에서이 관심을 만드는 경우

. 내 코드를 '아니오'라고 표현하는 메타 데이터? 컴퓨터가 어떻게 내 목적을 이해하고 나를 위해 그것을 생성 할 수 있습니까? HTML에서 메타 태그는 수동으로 키워드와 제목을 사용하여 페이지를 설명하기 때문에 브라우저는 페이지 내용을 이해하고 키워드와 제목을 생성하기에 충분하지 않습니다. 나는 혼란 스럽다. – KMC

+0

그래서 메타 데이터는 클래스, 메소드, 변수 등에 대한 식별자를 캡처합니다.이 점은 무엇입니까? 식별자 이름을 가져 오는 중 데이터를 설명하는 중입니까? 메소드 서명은 메소드의 정보를 요약하는 것이지만 그 자체는 더욱 혼란 스럽습니다. 죄송합니다. 도와주세요 – KMC

+0

오른쪽, 메서드 서명은 메타 데이터의 일부입니다. 메서드를 호출하기 만하면 메서드의 이진 오프셋과 매개 변수의 수와 크기를 알면 충분합니다. 그러나 .NET은 메서드 이름, 반환 형식, 각 매개 변수의 정확한 형식과 이름, 메서드 또는 매개 변수의 모든 특성 등의 전체 서명을 저장합니다. 메타 데이터입니다. 요점은 Reflection (그리고 다른 것들)을 가능하게하는 것입니다. – EMP

4

간단히 말해서, 메타 데이터는 프로그램에 대해 저장되는 정보로 여러 가지 방법으로 검사 할 수 있습니다.이러한 메서드 중 하나를 일반적으로 Reflection이라고합니다.

메타 데이터는 적용된 형식 (예 : 클래스, 인터페이스, ...), 메서드 및 매개 변수 (이름 및 형식) 및 특성을 설명합니다. 이 정보는 여러 가지 방법으로 사용할 수 있습니다. nunit 및 msstest와 같은 테스트 시스템은 메타 데이터를 사용하여 어셈블리 내에서 테스트를 '검색'합니다. 메타 데이터를 사용할 수있는 다른 방법은 데이터 바인딩입니다.

이 그것을 사용하는 많은 방법이있다 - 다른 사람이 이미 좋은 설명 답변을 제공하기 때문에 그들은 심지어 책 (물론 섹션 적어도 http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729)

+0

"myMethod"메서드가있는 경우 메타 데이터는 어떻게 설명합니까? 컴파일러는 메서드가 의미하는 것을 알지 못하고 실행 만합니다. 수동으로 직접 입력 한 것 이외에 설명이 어떻게 생성 될 수 있습니까? 혼란스러워. – KMC

+0

정확히, 메타 데이터는 형식 이름, 메서드 이름, 매개 변수 이름, 지역 변수 이름 등의 정보입니다 ... –

+1

[ILSpy] (http://wiki.sharpdevelop.net/)에서 살펴보십시오. ILSpy.ashx) 메타 데이터가 IL을 해석하고 "동등한"소스 코드를 반환하는 데 사용되는지 확인합니다. –

2

복잡하지 않다. 단지 데이터에 관한 데이터 (정보).

HTML의 메타 태그를 생각하면 페이지, 키워드, 작성자, 마지막으로 수정 한 페이지에 대한 정보가 있습니다. 그것은 당신의 html 페이지 인 데이터에 관한 정보를 보유한다는 것을 의미합니다.

우리가 C#으로 말하면,메타 데이터는 .NET Framework 이식 가능 실행 파일 (PE)의 한 섹션에 저장되며 Microsoft 중간 언어 (MSIL)는 PE 파일의 다른 섹션에 저장됩니다. 파일의 메타 데이터 부분은 일련의 테이블 및 힙 (heap) 데이터 구조를 포함합니다. MSIL 부분에는 PE 파일의 메타 데이터 부분을 참조하는 메타 데이터 토큰 및 MSIL이 포함됩니다. 각 메타 데이터 테이블에는 프로그램 요소에 대한 정보가 들어 있습니다. 예를 들어, 하나의 메타 데이터 테이블은 코드의 클래스를 설명하고 다른 테이블은 필드를 설명합니다. 코드에 10 개의 클래스가있는 경우 클래스 테이블에는 각 클래스에 하나씩 수십 개의 행이 있습니다. 메타 데이터 테이블은 다른 테이블과 힙을 참조합니다. 예를 들어 클래스의 메타 데이터 테이블은 메소드 테이블을 참조합니다. 메타 데이터는 문자열, BLOB, 사용자 문자열 및 GUID의 네 가지 힙 구조로 정보를 저장합니다. 형식 및 멤버의 이름을 지정하는 데 사용되는 모든 문자열은 문자열 힙에 저장됩니다. 예를 들어, 메소드 테이블은 특정 메소드의 이름을 직접 저장하지 않지만 문자열 힙에 저장된 메소드의 이름을 가리 킵니다. 당신은 내가 위키를 읽어 https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx

관련 문제