Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中的元数据是什么?_C#_.net_Metadata - Fatal编程技术网

C# NET中的元数据是什么?

C# NET中的元数据是什么?,c#,.net,metadata,C#,.net,Metadata,我用谷歌搜索了几个网站,以了解.NET中的元数据及其含义 我对C#WPF桌面应用程序编程还是新手。当我还在做网页编程时,HTML代码中有一个元标记,我们用标题、关键字等来描述网站。在.NET应用程序中也类似吗?我读维基,用谷歌搜索,但我得到的只是概念上的解释 一个描述“元数据是描述程序集状态的数据,以及程序集中每个类型、属性的详细描述”。元数据只是一个概念,还是像我在某处键入的代码行这样的物理概念来描述我的代码?如果是这样,我的元数据是否会成为我的元数据 我在公共语言运行库(CLR)中读取元数据

我用谷歌搜索了几个网站,以了解.NET中的
元数据及其含义

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

一个描述<代码>“元数据是描述程序集状态的数据,以及程序集中每个类型、属性的详细描述”
。元数据只是一个概念,还是像我在某处键入的代码行这样的物理概念来描述我的代码?如果是这样,我的元数据是否会成为我的元数据

我在公共语言运行库(CLR)中读取元数据是
,但我只在C#中编码,如何在CLR中编码到元数据中?元数据是CLR中的一个重要元素吗?我怎样才能改变它

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


我完全搞糊涂了。

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

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

这上面的维基百科页面相当不错:

编辑:否,元数据与注释不同。它只是“关于代码的数据”,而不是代码本身的一部分(不需要运行程序)。它与HTML元数据完全不同。元数据的一个例子是,程序集包含一个名为“MyClass”的类,该类包含一个名为“DoSomething”的方法,该方法带有某些参数,等等。因此,这并不是什么神秘的事情,主要是“明显的”东西。

本文介绍的是dot-net中的元数据。看一看。我希望它能澄清很多事情。它有链接到一个页面解释


在.net中是一个非常强大的概念,它基于与实际代码一起存储。

简单地说,元数据是存储在您的程序中的信息,您可以通过多种方式进行检查。在.net中,这些方法之一通常被称为反射

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


有很多方法可以使用它-他们甚至有关于它的书籍(至少有一些章节)

因为其他人已经提供了很好的解释性答案,我只想提到如何自己查看元数据

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

您可以构建非常简单的控制台应用程序,并使用
ildasm.exe
查看编译的内容。 查看/元信息/显示!命令(或简单的Ctrl+M)将显示元数据-您可以检查它们的外观。从应用程序打印到控制台的部分元数据:

TypeDef#1(02000002)
-------------------------------------------------------
类型名称:程序(02000002)
标志:[Public][AutoLayout][Class][AnsiClass][BeforeFieldInit](00100001)
扩展:01000001[TypeRef]System.Object
方法#1(06000001)[入口点]
-------------------------------------------------------
方法名称:Main(06000001)
标志:[Public][Static][hidebysing][ReuseSlot](00000096)
RVA:0x00002050
ImplFlags:[IL][Managed](00000000)
CallCnvntn:[默认值]
返回类型:Void
1.论点
参数#1:SZArray字符串
1参数
(1) ParamToken:(0800001)名称:args标志:[无](00000000)

在这里您可以看到类型定义(
Program
)及其方法之一(
Main
),它接受单个输入参数并返回void。这自然只是元数据的一部分,即使对于最简单的程序,也有更多的元数据。

不要让它变得复杂,它只是---数据(信息)关于数据

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

当我们用C#来谈论时, 元数据存储在.NET Framework可移植可执行文件(PE)的一部分中,而Microsoft中间语言(MSIL)存储在PE文件的另一部分中。文件的元数据部分包含一系列表和堆数据结构。MSIL部分包含引用PE文件元数据部分的MSIL和元数据标记。 每个元数据都有一个ta
class Program
{
    public static void Main(string[] args)
    {
        var x = 2 + 2;
        Console.WriteLine("Hello World!");
    }
}
class Program
{
    public static void Main(string[] args);
}
var x = 2 + 2;
Console.WriteLine("Hello World!");