什么是.NET中的元数据

本文关键字:元数据 NET 什么 | 更新日期: 2023-09-27 18:20:21

我搜索了几个网站来了解metadata在.NET中的含义。

我对C#WPF桌面应用程序编程还是个新手。当我做网络编程的时候,HTML代码中有元标签,我们用标题、关键字等来描述网站。在.NET应用程序中也是类似的吗?我读过维基,也在谷歌上搜索过,但我得到的只是概念性的解释。

一种是描述CCD_ 2。元数据只是一个概念还是物理上的东西,就像我在某个地方键入的描述代码的代码行?如果是这样的话,我的赞扬会成为我的元数据吗?

我读元数据是"Within the Common Language Runtime (CLR)",但我只在C#中编码,如何在CLR中编码到元数据中?元数据在CLR中值得称赞吗?我该怎么改?

MSDN写道,元数据是另一种语言的软件组件理解它的二进制信息。我认为只有人类需要用英语描述(赞扬)才能理解代码块的作用。软件组件只需执行我们编写的任何语句——这就是对"二进制"信息的需求。编译器如何理解生成"程序集描述"的高级代码的含义?如果我写一个转换货币的程序,元数据会在知道程序正在转换货币的情况下自动生成吗?这些情报在哪里?

我完全糊涂了。

什么是.NET中的元数据

由于其他人已经提供了很好的解释性答案,我只想介绍一下如何自己查看元数据。

在您的Microsoft SDK目录(很可能是C:''Program Files''Microsoft SDKs''Windows''v7.0A''Bin''NETFX 4.0 Tools的变体)中,有一个名为ildasm.exe的程序,它是一个简单的反汇编程序,允许您查看已编译的.NET二进制文件。

您可以构建非常简单的控制台应用程序,并使用ildasm.exe来查看编译后的内容。查看/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。这自然只是元数据的一部分,即使对于最简单的程序,也有更多。

如果您熟悉.NET反射,您可以将元数据视为"反射访问的数据"。每个.NET程序集都存储有关它所包含的类型和方法、这些方法的属性等的信息。它不需要仅为了运行代码而存储这些信息(本机EXE没有这种信息),但它需要用于其他目的,如强制声明性安全性和启用反射。

因此,元数据是"物理的东西",但其中大部分是从您编写的代码中自动生成的。向类或方法添加属性可能是直接更改元数据的唯一方法。特别是,源代码注释不会作为元数据(或以任何其他方式)存储在程序集中。

维基百科关于这方面的页面非常好:http://en.wikipedia.org/wiki/.NET_metadata

编辑:否,元数据不像注释。它只是"关于代码的数据",不是代码本身的一部分(运行程序不需要)。它根本不像HTML元数据。元数据的一个例子是,程序集包含一个名为"MyClass"的类,该类包含一个带有某些参数的名为"DoSomething"的方法,等等。所以这并不神秘,主要是"显而易见"的东西。

这是一篇关于点网元数据的伟大而全面的文章。看看它。我希望它能澄清很多事情。它有一个链接,指向一个页面,解释如何在运行时使用元数据。

点网中的反射是一个非常强大的概念,它基于读取与实际代码一起存储的元数据。

元数据是源代码本身信息的一部分,在编译时存储在程序集中的一个特殊部分中。它实际上是程序集结构的一个实现细节。对于典型的C#应用程序开发,您并不需要真正了解这一点。如果您开发开发人员工具,它最重要。

"元数据"一词有些误导性。程序集元数据包括代码中的常量和字符串文字等内容,这些内容并不是通常意义上的元数据。一个更正确的术语可能是不可执行的数据。

当C#被编译成程序集时,编译输出被分为两部分。IL是字节码格式的实际可执行代码,而"元数据"是所有其他东西:类型、接口和成员声明、方法签名、常量、外部依赖项等等

以这个程序为例:

class Program
{
    public static void Main(string[] args)
    {
        var x = 2 + 2;
        Console.WriteLine("Hello World!");
    }
}

当这个程序被编译成程序集时,它被分为元数据和IL。元数据包含以下声明(以独立于语言的二进制格式表示):

class Program
{
    public static void Main(string[] args);
}

此外,元数据包含字符串文字"Hello World!",以及程序集在mscorlib.dll中引用System.Console.WriteLine的信息。

只有这部分被编译成IL:

var x = 2 + 2;
Console.WriteLine("Hello World!");

需要注意的是,方法引用和文字字符串在IL中表示为指向元数据的指针。另一方面,元数据中的方法声明具有指向实现方法体的代码的IL的指针。

因此,它归结为一种将可执行(命令性)IL代码与不可执行(声明性)部分分离的方法。

为什么这种分离有用?因为它允许工具在不必实际执行任何IL的情况下提取和使用元数据。例如,Visual Studio能够通过读取元数据为程序集中定义的成员提供代码完成。编译器可以检查从其他程序集调用的方法是否确实存在,参数是否匹配等等

元数据描述了已应用的类型(例如类、接口…)、方法和参数(名称和类型)以及属性。您可以通过多种方式使用这些信息,例如nunit和msstest等测试系统使用元数据来"发现"程序集中的测试;元数据的其他使用方式是数据绑定。

有很多方法可以使用它——他们甚至有关于它的书(至少是井部分http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729)

不要让它变得复杂——它只是关于数据的数据(信息)。

想想HTML中的Meta标签,它包含关于页面、关键字、作者、上次修改的信息。这意味着它包含有关作为html页面的数据的信息。

当我们谈论C#时,元数据存储在.NET Framework可移植可执行文件(PE)的一个部分中,而Microsoft中间语言(MSIL)存储在PE文件的另一部分中。文件的元数据部分包含一系列表和堆数据结构。MSIL部分包含MSIL和引用PE文件的元数据部分的元数据令牌。每个元数据表都包含有关程序元素的信息。例如,一个元数据表描述代码中的类,另一个表描述字段,依此类推。如果代码中有十个类,则该类表将有十行,每个类一行。元数据表引用其他表和堆。例如,类的元数据表引用方法的表。元数据还以四种堆结构存储信息:字符串、blob、用户字符串和GUID。用于命名类型和成员的所有字符串都存储在字符串堆中。例如,方法表不直接存储特定方法的名称,而是指向存储在字符串堆中的方法名称。

如果这让你感兴趣--https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx