Что такое метаданные в .NET? - PullRequest
37 голосов
/ 14 января 2012

Я погуглил несколько сайтов, чтобы понять, что такое metadata в .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 написал, что метаданные - это двоичная информация для программного компонента другого языка, чтобы понять его .Я, однако, только человек нуждается в описании (похвалы) на английском языке, чтобы понять, что делает блок кода.Программный компонент просто выполняет любое написанное нами утверждение - зачем нужна «двоичная» информация.Как компилятор может понять значение моего высокоуровневого кода для генерации «Описание сборки» ?Если я напишу программу, которая конвертирует валюту, будут ли метаданные автоматически генерироваться, зная, что программа конвертирует валюту?Где этот разум?

Я полностью сбит с толку.

Ответы [ 5 ]

20 голосов
/ 14 января 2012

Поскольку другие уже давали отличные пояснительные ответы, я просто упомяну, как вы можете просматривать метаданные самостоятельно.

В вашем каталоге 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) и один из его методов (Main), который принимает один входной аргумент и возвращает void. Это, естественно, только часть метаданных, даже для самых простых программ гораздо больше.

16 голосов
/ 14 января 2012

Если вы знакомы с .NET Reflection, вы можете думать о метаданных как о «данных, к которым обращается Reflection». Каждая сборка .NET хранит информацию о том, какие типы и методы она содержит, атрибуты этих методов и т. Д. Не нужно хранить это только для запуска кода (нативные EXE-файлы не имеют такой информации), но она он нужен для других целей, таких как обеспечение декларативной безопасности и включение Reflection.

Таким образом, метаданные являются «чем-то физическим», но большая их часть автоматически генерируется из кода, который вы пишете. Добавление атрибутов в ваши классы или методы, вероятно, является единственным способом непосредственного изменения метаданных. В частности, ваши комментарии исходного кода не будут храниться в сборке как метаданные (или любым другим способом).

Страница Википедии на этом довольно хороша: http://en.wikipedia.org/wiki/.NET_metadata

Редактировать: Нет, метаданные не похожи на комментарии. Это просто «данные о коде», которые не являются частью самого кода (не нужны для запуска программы). Это совсем не похоже на метаданные HTML. Примером метаданных является тот факт, что сборка содержит класс с именем «MyClass», а этот класс содержит метод с именем «DoSomething» с определенными параметрами и т. Д. Так что в этом нет ничего загадочного - в основном «очевидные» вещи.

11 голосов
/ 14 января 2012

Эта статья является отличной и всеобъемлющей статьей о метаданных в точечной сети. Посмотрите на это. Я надеюсь, что это многое прояснит. Он имеет ссылку на страницу, объясняющую , как метаданные используются во время выполнения .

Отражение в точечной сети - очень мощная концепция, основанная на чтении метаданных , хранящихся вместе с реальным кодом.

4 голосов
/ 14 января 2012

Проще говоря, метаданные - это информация, хранящаяся о вашей программе, которую вы можете проверить несколькими способами, в .NET один из этих методов обычно называется отражением

Метаданные описывают типы (например, классы)., интерфейсы, ...), методы и параметры (имена и типы) и атрибуты, которые были применены.Вы можете использовать эту информацию несколькими способами, например, тестовые системы, такие как nunit и msstest (среди прочих), используют метаданные для «обнаружения» тестов в сборке;другие способы использования метаданных - это привязка данных.

Есть так много способов использовать его - у них даже есть книги на нем (хорошо разделы по крайней мере http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729)

3 голосов
/ 06 мая 2015

не усложняйте, это просто --- данные (информация) о данных.

просто подумайте о метатеге в HTML, он содержит информацию о странице, ключевом слове, авторе, последних изменениях.это означает, что он содержит информацию о данных, являющихся вашей HTML-страницей.

Когда мы говорим на языке C #, метаданные хранятся в одном разделе переносимого исполняемого файла (PE) .NET Framework, в то время как промежуточный язык Microsoft(MSIL) хранится в другом разделе файла PE.Часть метаданных файла содержит серию структур данных таблицы и кучи.Часть MSIL содержит MSIL и токены метаданных, которые ссылаются на часть метаданных PE-файла.Каждая таблица метаданных содержит информацию об элементах вашей программы.Например, одна таблица метаданных описывает классы в вашем коде, другая таблица описывает поля и так далее.Если в вашем коде десять классов, таблица классов будет иметь десятки строк, по одной для каждого класса.Таблицы метаданных ссылаются на другие таблицы и кучи.Например, таблица метаданных для классов ссылается на таблицу методов.Метаданные также хранят информацию в четырех структурах кучи: строка, большой двоичный объект, пользовательская строка и GUID.Все строки, используемые для именования типов и членов, хранятся в куче строк.Например, таблица методов напрямую не хранит имя конкретного метода, но указывает на имя метода, хранящееся в куче строк.

, если это вызывает у вас интерес - https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...