web-dev-qa-db-ja.com

.NETのメタデータとは何ですか?

.NETでのmetadataの意味とその意味を理解するために、いくつかのサイトをグーグル検索しました。

私はまだC#WPFデスクトップアプリケーションプログラミングに慣れていません。私がWebプログラミングをしていた頃、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 [〜#〜] は、メタデータがそれを理解するための別の言語のソフトウェアコンポーネントのバイナリ情報であることを書きました。私は人間だけが、コードのブロックが何をするのかを理解するために英語での記述(推奨)を必要とします。ソフトウェアコンポーネントは、私たちが書いた文を実行するだけです-「バイナリ」情報の必要性は何ですか。 「アセンブリの説明」を生成するための高レベルコードの意味をコンパイラがどのように理解できますか?通貨を変換するプログラムを作成すると、プログラムが通貨を変換していることを認識してメタデータが自動生成されますか?この知性はどこにありますか?

私は完全に混乱しています。

37
KMC

他の人がすでにすばらしい説明の答えを提供しているので、私はあなたがあなた自身でメタデータを見ることができる方法に言及するだけです。

Microsoft SDKディレクトリ(ほとんどの場合C:\ Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Toolsのバリエーション)にildasm.exeというプログラムがあります-それは単純な逆アセンブラーですこれにより、コンパイル済みの.NETバイナリを表示できます。

非常に単純なコンソールアプリケーションを構築し、ildasm.exeを使用してコンパイルされたコンテンツを表示できます。 View/MetaInfo/Show!コマンド(または単に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)

ここでは、型定義(Program)とそのメソッドの1つ(Main)を見ることができます。これは、単一の入力引数を取り、voidを返します。これは当然、メタデータの一部にすぎません。最も単純なプログラムであっても、さらに多くの機能があります。

20
k.m

.NET Reflectionに精通している場合、メタデータは「Reflectionがアクセスするデータ」と考えることができます。各.NETアセンブリには、含まれる型やメソッド、それらのメソッドの属性などに関する情報が格納されます。コードを実行するためだけに格納する必要はありません(ネイティブEXEにはそのような情報はありません)宣言的なセキュリティの実施やReflectionの有効化など、他の目的で必要になります。

したがって、メタデータは「物理的なもの」ですが、その大部分は、作成したコードから自動的に生成されます。クラスまたはメソッドに属性を追加することが、おそらくメタデータを直接変更できる唯一の方法です。特に、ソースコードのコメントは、メタデータとして(またはその他の方法で)アセンブリに保存されません。

これに関するウィキペディアのページは非常に優れています: http://en.wikipedia.org/wiki/.NET_metadata

編集:いいえ、メタデータはコメントのようなものではありません。これは単に「コードに関するデータ」であり、コード自体の一部ではありません(プログラムの実行には不要です)。 HTMLメタデータとはまったく異なります。メタデータの例としては、アセンブリに「MyClass」という名前のクラスが含まれ、そのクラスに「DoSomething」という名前のメソッドと特定のパラメーターなどが含まれているという事実があります。

16
EMP

これは、ドットネットのメタデータに関する すばらしい包括的 の記事です。それを見てください。多くのことが明らかになることを願っています。 実行時にメタデータがどのように使用されるか を説明するページへのリンクがあります。

Reflection ドットネットは非常に強力な概念であり、実際のコードと一緒に保存されている メタデータの読み取り に基づいています。

11
Haris Hasan

簡単に言えば、メタデータとはプログラムについて保存された情報であり、多くの方法で調べることができます。

メタデータは、適用されたタイプ(クラス、インターフェースなど)、メソッドとパラメーター(名前とタイプ)、および属性を記述します。この情報は、さまざまな方法で使用できます。 nunitやmsstestなどのテストシステムは、メタデータを使用して、アセンブリ内のテストを「発見」します。メタデータを使用できる他の方法は、データバインディングです。

それを使用する方法は非常に多くあります-彼らはそれについての本さえ持っています(少なくともセクション http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729

4
Shaun Wilde

複雑にしないでください---データに関するデータ(情報)。

hTMLのMetaタグについて考えてください。ページ、キーワード、作成者、最終変更に関する情報を保持しています。 htmlページであるデータに関する情報を保持することを意味します。

C#の観点から言えば、メタデータは.NET Frameworkポータブル実行可能(PE)ファイルの1つのセクションに保存され、Microsoft中間言語(MSIL)はPEファイルの別のセクションに保存されます。ファイルのメタデータ部分には、一連のテーブルとヒープのデータ構造が含まれています。 MSIL部分には、PEファイルのメタデータ部分を参照するMSILおよびメタデータトークンが含まれます。各メタデータテーブルには、プログラムの要素に関する情報が含まれています。たとえば、あるメタデータテーブルはコード内のクラスを説明し、別のテーブルはフィールドなどを説明します。コードに10個のクラスがある場合、クラステーブルには、各クラスに1つずつ、合計10個の行があります。メタデータテーブルは、他のテーブルとヒープを参照します。たとえば、クラスのメタデータテーブルはメソッドのテーブルを参照します。また、メタデータは、情報を4つのヒープ構造(文字列、ブロブ、ユーザー文字列、およびGUID)に保存します。型およびメンバーに名前を付けるために使用されるすべての文字列は、文字列ヒープに格納されます。たとえば、メソッドテーブルは特定のメソッドの名前を直接格納するのではなく、文字列ヒープに格納されているメソッドの名前を指します。

これがあなたに興味を持っている場合refer -- https://msdn.Microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx

3
Reeves