我在几个网站上进行了搜索,以了解 .NET 中的 metadata
及其含义。
我对 C# WPF 桌面应用程序编程还是个新手。当我在进行网络编程时,HTML 代码中有元标记,我们用标题、关键字等来描述网站。在 .NET 应用程序中也类似吗?我阅读了维基百科并进行了谷歌搜索,但我得到的只是概念性解释。
一个描述“元数据是描述程序集状态的数据以及程序集中每种类型、属性的详细描述”
。元数据只是一个概念还是物理上的东西,比如我在某处输入的代码行来描述我的代码?如果是这样,我的表扬会成为我的元数据吗?
我读到的元数据是 “Within the Common Language Runtime (CLR)”
,但我只用 C# 编写代码,如何将 CLR 代码写入元数据?元数据在 CLR 中是一种表扬吗?我怎样才能改变它。
MSDN写道,元数据是供另一种语言的软件组件理解的二进制信息。我虽然只有人类需要用英语描述(推荐)才能理解一段代码的作用。软件组件简单地执行我们写的任何语句——什么是“二进制”信息的需要。编译器如何理解我的高级代码的含义以生成“程序集描述”?如果我编写一个转换货币的程序,是否会在知道该程序正在转换货币的情况下自动生成元数据?这种情报在哪里?
我完全糊涂了。
最佳答案
由于其他人已经提供了很好的解释性答案,我将仅提及您如何自己查看元数据。
在您的 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。这自然只是元数据的一部分,即使对于最简单的程序,也有更多元数据。
关于c# - .NET 中的元数据是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8861065/