我用Google搜索了几个网站来了解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写道,元数据是另一种语言的软件组件的二进制信息,以便理解它.我虽然只有人类需要用英语描述(推荐)来理解代码块的作用.软件组件只是执行我们编写的任何语句 - 什么是"二进制"信息的需要.编译器如何理解我的高级代码的含义以生成"汇编描述"?如果我编写一个转换货币的程序,知道该程序的元数据会自动生成转换货币吗?这种情报在哪里?
我完全糊涂了.
k.m*_*k.m 20
由于其他人已经提供了很好的解释性答案,我只想提一下如何自己查看元数据.
在您的Microsoft SDK目录(很可能是C:\ Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools的变体)中有一个名为的程序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)
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到类型定义(Program)及其方法之一(Main),它接受单个输入参数并返回void.这自然只是元数据的一部分,即使对于最简单的程序也是如此.
EMP*_*EMP 16
如果您熟悉.NET Reflection,则可以将元数据视为"Reflection访问的数据".每个.NET程序集都存储有关它包含的类型和方法,这些方法的属性等信息.它不需要存储它只是为了运行代码(本机EXE没有那种信息),但它需要它用于其他目的,例如强制声明性安全性和启用反射.
所以元数据是"物理的东西",但大部分都是从你编写的代码中自动生成的.向类或方法添加属性可能是您可以直接更改元数据的唯一方法.特别是,您的源代码注释不会作为元数据(或以任何其他方式)存储在程序集中.
Wikipedia页面非常好: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!");
}
}
Run Code Online (Sandbox Code Playgroud)
当这个程序被编译成一个程序集时,它被分成元数据和IL。元数据包含以下声明(以独立于语言的二进制格式表示):
class Program
{
public static void Main(string[] args);
}
Run Code Online (Sandbox Code Playgroud)
此外,元数据包含字符串文字"Hello World!"以及程序集System.Console.WriteLine在 中引用的信息mscorlib.dll。
只有这部分被编译成 IL:
var x = 2 + 2;
Console.WriteLine("Hello World!");
Run Code Online (Sandbox Code Playgroud)
需要注意的是,方法引用和文字字符串在 IL 中表示为指向元数据的指针。另一方面,元数据中的方法声明具有指向实现方法主体的代码的 IL 的指针。
因此,它归结为一种将可执行(命令性)IL 代码与不可执行(声明性)部分分开的方法。
为什么这种分离有用?因为它允许工具提取和使用元数据,而无需实际执行任何 IL。例如,Visual Studio 能够仅通过读取元数据为程序集中定义的成员提供代码完成。编译器可以检查从其他程序集调用的方法是否实际存在以及参数是否匹配等等。