2012-01-14 35 views
29

我搜索了幾個網站,以瞭解什麼是metadata在.NET中,它的意思。什麼是.NET中的元數據?

我還不熟悉C#WPF桌面應用程序編程。當我進行網絡編程時,在HTML代碼中有元標記,我們用標題,關鍵字等描述網站。 .NET應用程序中也類似嗎?我讀了wiki,並用google搜索了一下,但我得到的只是概念性的解釋。

一個描述了"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寫道元數據是另一種語言的軟件組件的二進制信息瞭解它。我雖然只用人類的需求來描述(推薦)用英文來理解代碼塊的功能。軟件組件只是執行我們寫的任何語句 - 「二進制」信息的需求是什麼。編譯器如何理解我的高級代碼的含義以生成「程序集描述」?如果我編寫一個轉換貨幣的程序,知道該程序的元數據是否會自動生成貨幣?這個智力在哪裏?

我完全困惑。

回答

15

既然別人已經提供了巨大的解釋性回答,我就提你怎麼能自己的元數據視圖。

在您的Microsoft SDK目錄(的ç最有可能的變化:\ Program Files文件\微軟的SDK \的Windows \ v7.0A \ BIN \ NETFX 4.0工具)有一個名爲ildasm.exe程序 - 這是簡單的反彙編器,允許你查看編譯的.NET二進制文件。

您可以構建非常簡單的控制檯應用程序並使用ildasm.exe來查看編譯的內容。 查看/ MetaInfo /顯示!命令(或簡單地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。這當然只是元數據的一部分,即使對於最簡單的程序也有很多。

+1

+1我必須把這個作爲我的答案,因爲它使閱讀其他答案是有道理的,並且清楚我的困惑。 – KMC 2012-01-16 09:30:07

14

如果您熟悉.NET Reflection,則可以將元數據視爲「Reflection訪問的數據」。每個.NET程序集存儲有關它包含的類型和方法,這些方法的屬性等的信息。它不需要存儲那些只是爲了運行代碼(本機EXE沒有那種信息),但它需要它用於其他目的,如強制執行聲明性安全性並啓用反射。

所以元數據是「物理上的東西」,但其中大部分是由您編寫的代碼自動生成的。將屬性添加到您的類或方法可能是您直接更改元數據的唯一方法。特別是,您的源代碼註釋不會以元數據(或任何其他方式)存儲在程序集中。

維基百科的頁面上,這是相當不錯的:http://en.wikipedia.org/wiki/.NET_metadata

編輯:沒有,元數據是不喜歡的意見。它僅僅是「關於代碼的數據」,它不是代碼本身的一部分(不需要運行該程序)。它根本不像HTML元數據。元數據的一個例子是程序集包含一個名爲「MyClass」的類,並且該類包含一個名爲「DoSomething」的方法,該方法帶有某些參數等等。所以這並不神祕 - 主要是「明顯」的東西。

+0

我讀了維基,我很困惑。元數據應該描述我的代碼,好像一個推薦不?計算機如何理解我的目的併爲我生成它?在HTML中,元標記是用關鍵字和標題手動輸入的,用於描述頁面,但瀏覽器不夠智能,無法理解頁面內容併爲我生成關鍵字和標題?男人我都很困惑.. – KMC 2012-01-14 08:48:27

+0

因此元數據捕獲類,方法,變量等的標識符。這有什麼意義?獲取標識符名稱=描述我的數據?我雖然方法簽名也總結了一種方法中的信息..更加困惑。抱歉。請幫助 – KMC 2012-01-14 09:12:05

+0

對,方法簽名是元數據的一部分。只需調用該方法,就可以知道方法的二進制偏移量以及參數的數量和大小。但是,.NET會存儲完整的簽名:方法名稱,返回類型,每個參數的確切類型和名稱,方法或參數的任何屬性等。這就是元數據。它的要點是啓用反射(和其他一些事情)。 – EMP 2012-01-14 09:46:21

4

簡單地說,元數據是存儲在您的程序中的信息,您可以通過多種方式來檢查。NET這些方法之一通常被稱爲反射

元數據描述類型(例如類,接口,...),方法和參數(名稱和類型)以及已應用的屬性。您可以通過多種方式使用這些信息,例如諸如nunit和msstest等測試系統使用元數據來「發現」程序集內的測試;數據綁定中可以使用元數據的其他方式。

有這麼多的方法來使用它 - 他們甚至有它的書(井段至少http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729

+0

如果我有一個方法「myMethod」,元數據將如何描述它?編譯器不知道該方法意味着什麼,只執行它,除了由我自己手工鍵入外,如何生成描述?困惑。 – KMC 2012-01-14 09:14:00

+0

準確地說,元數據是諸如類型名稱,方法名稱,參數名稱,局部變量名稱等信息... – 2012-01-14 21:28:21

+1

查看[ILSpy](http://wiki.sharpdevelop.net/) ILSpy.ashx)來查看元數據用於解釋IL並返回「等效」源代碼。 – 2012-01-14 21:34:49

2

不要讓它變得複雜它只是---關於數據的數據(信息)。

想想HTML中的Meta標籤,它包含有關頁面,關鍵字,作者,上次修改的信息。它意味着它擁有關於您的html頁面的數據的信息。

當我們談論C#時, 元數據存儲在.NET Framework可移植可執行文件(PE)文件的一部分中,而Microsoft中間語言(MSIL)存儲在PE文件的另一部分中。該文件的元數據部分包含一系列表和堆數據結構。 MSIL部分包含引用PE文件的元數據部分的MSIL和元數據令牌。每個元數據表都包含有關程序元素的信息。例如,一個元數據表描述了代碼中的類,另一個表描述了這些字段等等。如果您的代碼中有十個類,則該類表將包含十行,每個類一個。元數據表引用其他表和堆。例如,類的元數據表引用表的方法。 元數據還將信息存儲在四個堆結構中:字符串,blob,用戶字符串和GUID。所有用於命名類型和成員的字符串都存儲在字符串堆中。例如,方法表不直接存儲特定方法的名稱,而是指向存儲在字符串堆中的方法名稱。

如果這使得權益您refer-- https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx