2012-01-14 32 views
29

Tôi googled một số trang web để hiểu những gì metadata là trong .NET và nó có nghĩa là.Siêu dữ liệu trong .NET là gì?

Tôi vẫn còn mới đối với lập trình ứng dụng máy tính để bàn C# WPF. Quay lại khi tôi đang lập trình web, có thẻ meta trong mã HTML, nơi chúng tôi mô tả trang web có tiêu đề, từ khóa và như vậy. Cũng tương tự như trong ứng dụng .NET? Tôi đọc wiki, và googled nhưng tất cả tôi nhận được là giải thích về thụ thai.

Một mô tả "metadata is data that describes the state of the assembly and a detailed description of each type, attribute within the assembly". Siêu dữ liệu chỉ là một khái niệm hoặc thứ gì đó giống như dòng mã tôi đã nhập ở đâu đó để mô tả mã của tôi? Nếu vậy, lời khen của tôi có trở thành siêu dữ liệu của tôi không?

Tôi đọc siêu dữ liệu là "Within the Common Language Runtime (CLR)", nhưng tôi chỉ viết mã trong C#, làm cách nào tôi có thể mã trong CLR vào siêu dữ liệu? Siêu dữ liệu có được khen ngợi trong CLR không? Làm thế nào tôi có thể thay đổi nó.

MSDN đã viết siêu dữ liệu đó là thông tin nhị phân cho thành phần phần mềm của một ngôn ngữ khác để hiểu nó. Tôi mặc dù chỉ mô tả nhu cầu của con người (khen) bằng tiếng Anh để hiểu một khối mã nào. Thành phần phần mềm đơn giản thực thi bất kỳ câu lệnh nào mà chúng ta đã viết - nhu cầu của thông tin "nhị phân" là gì. Làm thế nào trình biên dịch có thể hiểu ý nghĩa của mã mức cao của tôi để tạo ra "Mô tả lắp ráp"? Nếu tôi viết một chương trình chuyển đổi tiền tệ, siêu dữ liệu có được tự động tạo ra khi biết chương trình đang chuyển đổi tiền tệ không? Thông minh này ở đâu?

Tôi hoàn toàn bối rối.

Trả lời

15

Kể từ khi những người khác đã được cung cấp câu trả lời giải thích tuyệt vời, tôi sẽ chỉ đề cập đến làm thế nào bạn có thể xem siêu dữ liệu cho mình.

Trong thư mục Microsoft SDK của bạn (biến thể có khả năng nhất của C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Công cụ) có chương trình gọi là ildasm.exe - đó là bộ phận phân tách đơn giản cho phép bạn xem biên dịch.

Bạn có thể tạo ứng dụng bảng điều khiển rất đơn giản và sử dụng ildasm.exe để xem nội dung đã biên dịch. Xem/MetaInfo/Hiển thị! lệnh (hoặc chỉ đơn giản là Ctrl + M) sẽ hiển thị siêu dữ liệu - bạn có thể kiểm tra xem chúng trông như thế nào. Một phần của siêu dữ liệu từ ứng dụng in Hello để an ủi:

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) 

Ở đây bạn có thể thấy định nghĩa kiểu (Program) và một trong những phương thức của nó (Main), trong đó có lập luận đơn đầu vào và trả về void. Điều này là tự nhiên chỉ là một phần của siêu dữ liệu, ngay cả đối với các chương trình đơn giản nhất có rất nhiều hơn nữa.

+1

+1 Tôi phải coi đây là câu trả lời của tôi bởi vì nó làm cho việc đọc các câu trả lời khác có ý nghĩa và rõ ràng sự nhầm lẫn của tôi. – KMC

14

Nếu bạn quen với .NET Reflection, bạn có thể nghĩ siêu dữ liệu là "dữ liệu mà Reflection truy cập". Mỗi bộ sưu tập .NET lưu trữ thông tin về kiểu và phương thức nó chứa, các thuộc tính trên các phương thức đó, vv Nó sẽ không cần lưu trữ chỉ để chạy mã (các EXE nguyên gốc không có loại thông tin đó), nhưng nó cần nó cho các mục đích khác, như thực thi bảo mật khai báo và kích hoạt Reflection.

Vì vậy, siêu dữ liệu là "nội dung nào đó", nhưng phần lớn dữ liệu được tạo tự động từ mã bạn viết. Việc thêm các thuộc tính vào các lớp hoặc các phương thức của bạn có lẽ là cách duy nhất bạn có thể trực tiếp thay đổi siêu dữ liệu. Đặc biệt, các bình luận mã nguồn của bạn sẽ không được lưu trữ trong assembly như siêu dữ liệu (hoặc theo bất kỳ cách nào khác).

Trang Wikipedia về vấn đề này là khá tốt: http://en.wikipedia.org/wiki/.NET_metadata

Edit: Không, siêu dữ liệu không giống như ý kiến. Nó chỉ đơn giản là "dữ liệu về mã", mà không phải là một phần của chính mã đó (không cần thiết để chạy chương trình). Nó hoàn toàn không giống như siêu dữ liệu HTML. Một ví dụ về siêu dữ liệu là một thực tế là assembly chứa một lớp có tên là "MyClass" và lớp đó chứa một phương thức có tên "DoSomething" với các tham số nhất định, v.v.

+0

Tôi đọc Wiki và tôi nhầm lẫn. Siêu dữ liệu phải mô tả mã của tôi như một lời khen ngợi không? Làm thế nào máy tính có thể hiểu mục đích của tôi và tạo ra nó cho tôi? Trong HTML, thẻ meta được nhập bằng tay với từ khóa và tiêu đề để mô tả trang, trình duyệt sẽ không đủ thông minh để hiểu nội dung trang và tạo từ khóa và tiêu đề cho tôi? người đàn ông tôi đều bối rối .. – KMC

+0

để siêu dữ liệu nắm bắt số nhận dạng cho lớp, phương pháp, biến, v.v. Điểm của điều này là gì? Không nhận được tên nhận dạng = mô tả dữ liệu của tôi? Tôi mặc dù phương pháp chữ ký cũng tổng hợp các thông tin trong một method..again, thậm chí còn bối rối hơn. lấy làm tiếc. hãy giúp – KMC

+0

Phải, chữ ký phương thức là một phần của siêu dữ liệu. Chỉ cần gọi phương thức nó sẽ là đủ để biết bù đắp nhị phân của phương pháp và số lượng và kích thước của các tham số. Tuy nhiên, .NET lưu trữ chữ ký đầy đủ: tên phương thức, kiểu trả về, kiểu và tên chính xác của mỗi tham số, bất kỳ thuộc tính nào trên phương thức hoặc tham số, v.v ... Đó là siêu dữ liệu. Điểm của nó là kích hoạt Reflection (và một số thứ khác). – EMP

4

Đơn giản, Siêu dữ liệu là thông tin được lưu trữ về chương trình của bạn mà bạn có thể kiểm tra bằng một số phương tiện một, bằng.Một trong những phương pháp này thường được gọi là Reflection

Siêu dữ liệu mô tả các loại (ví dụ: lớp học, giao diện, ...), phương pháp và thông số (tên và loại) và các thuộc tính đã được áp dụng. Bạn có thể sử dụng thông tin này theo một số cách, ví dụ: hệ thống thử nghiệm như nunit và msstest (trong số những người khác) sử dụng siêu dữ liệu để 'khám phá' các thử nghiệm trong một hội đồng; các cách khác mà siêu dữ liệu có thể được sử dụng là trong databinding.

Có rất nhiều cách để sử dụng nó - họ thậm chí có cuốn sách về nó (cũng phần ít nhất http://my.safaribooksonline.com/book/programming/csharp/9781449379629/reflection-and-metadata/729)

+0

Nếu tôi có phương thức "myMethod", siêu dữ liệu sẽ mô tả nó như thế nào? Trình biên dịch không biết phương thức này có nghĩa là gì và chỉ thực thi nó, làm thế nào mô tả có thể được tạo ra ngoài cách tự nhập vào bằng tay? Bối rối. – KMC

+0

Chính xác, siêu dữ liệu là thông tin như tên loại, tên phương thức, tên tham số, tên biến cục bộ ... –

+1

Hãy xem [ILSpy] (http://wiki.sharpdevelop.net/ ILSpy.ashx) để xem siêu dữ liệu được đưa vào sử dụng để diễn giải IL và trả lại mã nguồn "tương đương". –

2

không làm cho nó phức tạp nó chỉ --- Dữ liệu (thông tin) về Dữ liệu.

chỉ cần nghĩ về thẻ Meta trong HTML, nó giữ thông tin về trang, từ khóa, tác giả, sửa đổi lần cuối. nó có nghĩa là nó giữ thông tin về một dữ liệu đó là trang html của bạn.

Khi chúng ta nói về C#, Siêu dữ liệu được lưu trữ trong một phần của tệp thực thi .NET Framework, trong khi ngôn ngữ trung gian của Microsoft (MSIL) được lưu trữ trong một phần khác của tệp PE. Phần siêu dữ liệu của tệp chứa một loạt các cấu trúc dữ liệu bảng và heap. Phần MSIL chứa mã thông báo MSIL và siêu dữ liệu tham chiếu đến phần siêu dữ liệu của tệp PE. Mỗi bảng siêu dữ liệu chứa thông tin về các yếu tố của chương trình của bạn. Ví dụ, một bảng siêu dữ liệu mô tả các lớp trong mã của bạn, một bảng khác mô tả các trường, v.v. Nếu bạn có mười lớp trong mã của bạn, bảng lớp sẽ có hàng chục hàng, một hàng cho mỗi lớp. Bảng siêu dữ liệu tham chiếu các bảng và vùng khác. Ví dụ, bảng siêu dữ liệu cho các lớp tham chiếu bảng cho các phương thức. Siêu dữ liệu cũng lưu trữ thông tin trong bốn cấu trúc heap: chuỗi, blob, chuỗi người dùng và GUID. Tất cả các chuỗi được sử dụng để đặt tên các loại và các thành viên được lưu trữ trong chuỗi chuỗi. Ví dụ, một bảng phương thức không trực tiếp lưu trữ tên của một phương thức cụ thể, nhưng trỏ đến tên của phương thức được lưu trữ trong chuỗi chuỗi.

nếu điều này khiến bạn quan tâm - https://msdn.microsoft.com/en-us/library/xcd8txaw%28v=vs.110%29.aspx

Các vấn đề liên quan