Bagikan melalui


File Metadata Windows (WinMD)

API Windows Runtime (WinRT) dijelaskan dalam file metadata yang dapat dibaca mesin dengan ekstensi .winmd (juga dikenal sebagai Metadata Windows). File metadata ini digunakan oleh alat dan proyeksi bahasa untuk mengaktifkan proyeksi bahasa.

Catatan umum

Windows menyertakan metadata untuk semua API WinRT yang disediakan sistem. Windows menyediakan API untuk membantu proyeksi bahasa dalam resolusi namespace layanan dan jenis yang membutuhkan metadata ini saat runtime. Windows SDK menyediakan salinan metadata sistem dalam satu file untuk digunakan oleh proyeksi bahasa yang membutuhkan metadata ini pada waktu kompilasi.

Pihak ketiga dapat mengembangkan API WinRT mereka sendiri yang dapat berpartisipasi dalam proyeksi bahasa seperti yang dilakukan OLEH API yang disediakan sistem. API WinRT pihak ketiga harus menyediakan metadata seperti yang dilakukan API sistem. API Windows untuk namespace layanan dan resolusi jenis bekerja pada metadata pihak ketiga seperti yang mereka lakukan untuk metadata sistem.

Semua jenis publik dalam file WinMD harus jenis WinRT, dan harus membawa bendera tdWindowsRuntime (detail tentang jenis bendera untuk diikuti). File WinMD mungkin menyertakan metadata untuk jenis non-WinRT. Setiap jenis non-WinRT dalam file WinMD tidak boleh publik. Semantik untuk jenis non-WinRT ditentukan implementasi, dan di luar lingkup dokumen ini.

Semua anggota antarmuka publik (metode, properti, dan peristiwa) pada jenis WinRT harus merupakan anggota antarmuka WinRT. Jenis WinRT dapat mencakup metadata untuk anggota antarmuka non-WinRT. Setiap anggota antarmuka non-WinRT mungkin tidak publik. Semantik untuk anggota antarmuka non-WinRT ditentukan implementasi dan di luar lingkup dokumen ini.

File WinMD

Format file WinMD

File WinMD menggunakan format file fisik yang sama dengan rakitan Common Language Runtime (CLR), seperti yang didefinisikan oleh spesifikasi ECMA-335. Namun, meskipun format file fisik sama, aturan untuk kombinasi data yang valid berbeda untuk file WinMD dan rakitan CLR. Dokumen ini mencantumkan delta antara file WinMD dan rakitan CLR.

File WinMD yang disediakan sistem adalah metadata murni. File WinMD pihak ketiga mungkin berisi kode. Secara khusus, file WinMD terkelola mencakup kode Microsoft Intermediate Language (MSIL), seperti yang dilakukan rakitan CLR tradisional.

Setiap file WinMD berisi definisi nol atau lebih jenis WinRT. File WinMD kosong secara teknis valid.

Tidak ada batasan WinRT khusus pada ARSITEKTUR PEKind atau mesin yang tercantum dalam WinMD.

String versi WinMD harus berisi "Windows Runtime 1.2".

Nama file WinMD

Nama (tanpa ekstensi) dari file WinMD harus kecocokan tidak peka huruf besar/kecil dengan kolom nama tabel rakitan di dalam file WinMD. Misalnya, file "Foo.Bar.winmd" harus memiliki "Foo.Bar" di kolom nama tabel assembly. Karena sistem file tidak peka huruf besar/kecil, kasus nama file mungkin berbeda dari nilai kolom nama tabel rakitan.

Semua jenis WinRT dalam file WinMD tertentu harus berada di bawah namespace yang cocok dengan nama file WinMD dan nilai kolom nama tabel rakitan. Karena sistem file tidak peka huruf besar/kecil, kasus nama file mungkin berbeda dari namespace semua jenis WinRT dalam file WinMD tertentu. Namespace semua jenis WinRT dalam WinMD tertentu harus sama persis dengan nilai kolom nama tabel rakitan (yaitu, peka huruf besar/kecil). Misalnya, semua jenis dalam file dengan "Foo.Bar" di kolom nama tabel rakitan harus berada di namespace "Foo.Bar". Jenisnya mungkin merupakan turunan langsung dari namespace layanan ini (misalnya, Foo.Bar.MyType), atau di sub-namespace namespace layanan ini (misalnya, Foo.Bar.Baz.MyType). Nama file harus "Foo.Bar.winmd", tetapi dapat bervariasi jika—yaitu, "foo.bar.winmd" dan "FOO. BAR. WINMD" juga akan diizinkan sebagai nama file untuk file metadata ini.

Komposisi WinMD

Metadata untuk semua jenis dalam sistem tersebar di beberapa file .winmd. Paket AppX dapat mencakup nol atau lebih file .winmd yang menjelaskan komponen WinRT pihak ketiga yang disertakan dalam paket aplikasi.

Di semua file .winmd yang disediakan oleh sistem, atau disertakan dengan aplikasi tertentu, setiap metadata jenis WinRT harus disimpan dalam file WinMD, dengan nama terpanjang yang cocok dengan namespace jenis. Semua jenis yang merupakan turunan langsung dari namespace layanan tertentu harus terletak di file yang sama. Misalnya, jika paket AppX menyertakan file Foo.winmd dan Foo.Bar.winmd, maka jenis Foo.Bar.Baz.MyType harus terletak di file Foo.Bar.winmd, karena itu adalah file dengan nama file yang cocok dengan namespace terpanjang untuk jenis dalam paket.

Pengalihan TypeDef

File metadata yang disediakan oleh sistem tidak pernah mereferensikan TypeDefs secara langsung. Bahkan saat mereferensikan jenis yang ditentukan dalam file metadata yang sama, file metadata sistem selalu mereferensikan TypeRef yang pada gilirannya mereferensikan TypeDef. Ini dilakukan untuk mendukung pengalihan jenis CLR (misalnya memproyeksikan IVector<T> sebagai IList<T>).

File metadata pihak ketiga dapat menggunakan TypeDef secara langsung, atau dapat mengalihkan semua referensi jenis melalui TypeRef yang mirip dengan cara file metadata sistem.

Mengetik pengodean sistem

Semua jenis dalam dokumen ini dari namespace layanan Sistem dari rakitan mscorlib digunakan sebagai penanda oleh WinRT. Jenis-jenis ini digunakan untuk menunjukkan informasi tentang jenis, dan tidak boleh diselesaikan. Ini termasuk (tetapi tidak terbatas pada) System.Object, System.Guid, System.ValueType, System.Enum, System.MulticastDelegate, dan System.Attribute. Perhatikan bahwa nama-nama ini dipilih untuk kompatibilitas dengan CLR. Definisi CLR dari jenis ini adalah bagian dari sistem jenis mereka, dan tidak ada hubungannya dengan WinRT.

Perhatikan bahwa banyak konstruksi yang dijelaskan di sini menggunakan sintaks C#. Ini hanya karena mudah untuk mewakili konstruksi metadata Common Language Infrastructure (CLI) tertentu menggunakan sintaks C#. Konstruksi aktual adalah konstruksi metadata CLI murni.

Ruang nama

WinRT mengodekan namespace dan nama lokal jenis dalam satu string yang dibatasi periode. Misalnya, jenis yang ditentukan dalam cuplikan kode ini adalah "Windows.Foundation.ISimpleInterface".

namespace Windows {
    namespace Foundation {
        interface ISimpleInterface {
            HRESULT Method1(int paramOne);
        };
    };
};

Untuk pengoptimalan ruang, tabel TypeDef dalam metadata CLI menyediakan kolom terpisah untuk nama jenis dan nama namespace layanan. Namun, pada tingkat API, properti TypeDef hanya mengekspos nama jenis.

Jenis-jenis dasar

Semua jenis dasar WinRT kecuali Guid memiliki nilai konstanta eksplisit untuk digunakan dalam blob Metadata CLI dan referensi jenis lainnya. Nilai konstanta ini dijelaskan dalam Partisi 2, Bagian 23.1.16 dari spesifikasi CLI.

Jenis WinRT Nama jenis elemen CLI Nilai jenis elemen CLI
Int16 ELEMENT_TYPE_I2 0x06
Int32 ELEMENT_TYPE_I4 0x08
Int64 ELEMENT_TYPE_I8 0x0a
UInt8 ELEMENT_TYPE_U1 0x05
UInt16 ELEMENT_TYPE_U2 0x07
UInt32 ELEMENT_TYPE_U4 0x09
UInt64 ELEMENT_TYPE_U8 0x0b
Tunggal ELEMENT_TYPE_R4 0x0c
Ganda ELEMENT_TYPE_R8 0x0d
Char16 ELEMENT_TYPE_CHAR 0x03
Boolean ELEMENT_TYPE_BOOL 0x02
String ELEMENT_TYPE_STRING 0x0e

Karena tidak memiliki nilai konstanta ELEMENT_TYPE_* eksplisit untuk mereka, Guid diwakili dalam metadata sebagai TypeRef ke jenis System.Guid dari rakitan mscorlib.

Enum

Enum direpresentasikan sebagai baris dalam tabel TypeDef (ECMA II.22.37) dengan kolom diatur sebagai berikut.

  • Bendera. Atur ke | Publik | tersegel tdWindowsRuntime (0x4101).
  • Nama. Indeks ke dalam tumpukan string yang berisi nama jenis .
  • Namespace. Indeks ke dalam tumpukan string yang berisi namespace jenis.
  • Meluas. Atur ke TypeRef yang mereferensikan kelas System.Enum di rakitan mscorlib.
  • FieldList. Indeks ke dalam tabel Bidang, yang menandai eksekusi bidang pertama yang berdampingan yang dimiliki oleh jenis ini.
  • MethodList. Harus kosong.

Enum memiliki bidang instans tunggal yang menentukan jenis bilangan bulat yang mendasar untuk enum, serta nol atau beberapa bidang statis; satu untuk setiap nilai enum yang ditentukan oleh jenis enum.

Jenis bilangan bulat yang mendasar dari enum muncul sebagai baris pertama dalam tabel Bidang (ECMA II.22.15) yang terkait dengan jenis (yaitu yang dirujuk dalam kolom FieldList yang ditentukan di atas). Kolom dalam tabel Bidang untuk jenis enum adalah sebagai berikut.

  • Bendera: | Privat | SpecialName RTSpecialName (0x601).
  • Nama: indeks ke dalam tumpukan string yang berisi nama "value__".
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob FieldSig (ECMA II.23.2.4) di mana Jenis diatur ke ELEMENT_TYPE_I4 atau ELEMENT_TYPE_U4, karena nilai enum WinRT harus ditandatangani atau bilangan bulat 32 bit yang tidak ditandatangani.

Setelah definisi nilai enum muncul definisi bidang untuk setiap nilai dalam enumerasi.

  • Bendera: | publik | statis | harfiah hasdefault (0x8056).
  • Nama: indeks ke dalam tumpukan string yang berisi nama nilai enum.
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob FieldSig (ECMA II.23.3.4) dengan Jenis diatur ke TypeDef dari jenis enum.

Untuk setiap definisi nilai Enum, ada baris yang sesuai dalam tabel Konstanta (ECMA II.22.9) untuk menyimpan nilai bilangan bulat untuk nilai enum.

  • Ketik. Satu byte untuk mewakili jenis enum yang mendasar, baik ELEMENT_TYPE_I4 atau ELEMENT_TYPE_U4, diikuti oleh satu byte padding nol sesuai spesifikasi ECMA.
  • Induk: Indeks ke dalam tabel bidang yang menyimpan rekaman nilai enum terkait.
  • Nilai: indeks ke dalam tabel blob yang menyimpan nilai bilangan bulat untuk nilai enum.

Selain itu, System.FlagsAttribute harus ditambahkan ke baris TypeDef enumerasi untuk enum apa pun dengan jenis UInt32 yang mendasar. FlagsAttribute tidak boleh ditambahkan ke baris enum TypeDef untuk enum dengan jenis Int32 yang mendasar.

Untuk semua enum yang disediakan sistem, VersionAttribute harus ditambahkan ke baris TypeDef enumerasi. Secara opsional, VersionAttribute dapat ditambahkan ke salah satu baris Bidang statis. Jika ada, nilai versi dari VersionAttribute pada baris Bidang enum apa pun harus lebih besar dari atau sama dengan nilai dari VersionAttribute pada baris typeDef enum.

Struct

Struktur diimplementasikan sebagai baris dalam tabel TypeDef (ECMA II.22.37) dengan kolom diatur sebagai berikut.

  • Bendera – | Publik | tersegel | Berurutan tdWindowsRuntime (0x4109).
  • Nama – indeks ke dalam tumpukan string yang berisi nama jenis.
  • Namespace – indeks ke dalam tumpukan string yang berisi namespace jenis.
  • Extends – diatur ke TypeRef yang mereferensikan kelas System.ValueType di rakitan mscorlib.
  • FieldList – Indeks ke dalam tabel Bidang, menandai eksekusi bidang pertama yang bersebelahan yang dimiliki oleh jenis ini.
  • MethodList – harus kosong.

Struktur memiliki satu atau beberapa entri tabel Bidang.

  • Bendera: publik.
  • Nama: indeks ke dalam tumpukan string yang berisi nama bidang.
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob FieldSig (ECMA II.23.2.4) dengan Jenis diatur ke token metadata untuk jenis bidang.
    • Bidang struktur harus berupa jenis dasar, enum, atau struktur lainnya.

Untuk semua struktur yang disediakan sistem, VersionAttribute harus ditambahkan ke baris TypeDef struct.

Delegasikan

Delegasi diimplementasikan sebagai baris dalam tabel TypeDef (ECMA II.22.37) dengan kolom yang ditetapkan sebagai berikut.

  • Bendera: diatur ke | Publik | tersegel tdWindowsRuntime (0x4101).
  • Nama – indeks ke dalam tumpukan string yang berisi nama jenis.
  • Namespace – indeks ke dalam tumpukan string yang berisi namespace jenis.
  • Perluas: atur ke TypeRef yang mereferensikan kelas System.MulticastDelegate di rakitan mscorlib.
  • FieldList: harus kosong.
  • MethodList: Indeks ke dalam tabel MethodDef (ECMA II.22.26), menandai yang pertama dari eksekusi metode yang berdampingan yang dimiliki oleh jenis ini.

Baris TypeDef delegasi harus memiliki GuidAttribute.

Delegasi memiliki tepat dua entri tabel MethodDef. Yang pertama mendefinisikan konstruktor. Konstruktor ini adalah penanda kompatibilitas, itulah sebabnya konstruktor ini menggunakan konstruksi non-WinRT seperti int asli, dan parameter yang bukan in atau out. Delegasi WinRT tidak memiliki metode konstruktor tersebut.

  • RVA: 0 (ini adalah konstruksi abstrak).
  • ImplFlags: runtime (0x03).
  • Bendera: | privat hidebysig | | nama khusus RTSpecialName (0x1881).
  • Nama: indeks ke dalam tabel string yang berisi nama ".ctor".
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) untuk metode dengan objek dan int asli dalam parameter dan tanpa nilai yang dikembalikan.
  • ParamList: indeks ke dalam tabel Param (ECMA II.22.33) yang berisi yang pertama dalam eksekusi baris Param yang terkait dengan metode ini. Setiap baris dalam tabel Param berisi informasi berikut.
    • Parameter objek
      • Urutan 1
      • Nama "objek"
      • Bendera: tidak ada (0x00)
    • Parameter Int Asli
      • Urutan 2
      • Nama "metode"
      • Bendera: tidak ada (0x00)

Entri MethodDef kedua mendefinisikan metode Invoke.

  • RVA: 0 (ini adalah konstruksi abstrak)
  • ImplFlags: runtime (0x03)
  • Bendera: | publik | virtual HideBySig | specialname (0x08C6)
  • Nama: indeks ke dalam tabel string yang berisi nama "Panggil"
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi jenis parameter dan jenis pengembalian delegasi. Jika delegasi diparameterkan, blob MethodDefSig harus mereferensikan setiap parameter jenis delegasi melalui Jenis yang dikodekan GENERICINST (sesuai ECMA II.23.2.12). Detail tentang delegasi parameter yang harus diikuti.
  • ParamList: indeks ke dalam tabel Param (ECMA II.22.33) yang berisi yang pertama dalam eksekusi baris Param yang terkait dengan metode ini. Setiap baris dalam tabel Param akan berisi informasi berikut.
    • Bendera – masuk atau keluar yang sesuai untuk parameter
    • Urutan – urutan parameter. Nol dicadangkan untuk nilai pengembalian metode
    • Nama – indeks ke dalam tumpukan string yang berisi nama parameter Untuk semua delegasi yang disediakan sistem, VersionAttribute harus ditambahkan ke baris TypeDef delegasi.

Delegasi berparameter

Delegasi berparameter memiliki persyaratan tambahan berikut.

  • Nama delegasi berparameter ditambahkan dengan backtick dan angka yang menunjukkan jumlah parameter jenis yang dimiliki delegasi berparameter. Misalnya, jenis Windows.Foundation.EventHandler<T> disimpan dalam metadata dengan nama Windows.Foundation.EventHandler'1.
  • Delegasi berparameter memiliki satu baris dalam tabel GenericParam (ECMA II.22.20) untuk setiap parameter jenis dengan kolom yang ditetapkan sebagai berikut.
    • Angka: indeks parameter generik, bernomor kiri-ke-kanan, dimulai dari nol.
    • Bendera: Tidak ada.
    • Pemilik: Indeks ke dalam tabel TypeDef untuk baris yang berisi antarmuka.
    • Nama: Indeks ke dalam tumpukan string yang berisi nama parameter generik.

Tabel TypeSpec (ECMA II.23.2.14) digunakan untuk menentukan instans delegasi parameter. TypeSpecs ini kemudian dapat digunakan dalam tanda tangan metode yang mirip dengan TypeRefs.

Antarmuka

Antarmuka diimplementasikan sebagai baris dalam tabel TypeDef (ECMA II.22.37) dengan kolom yang ditetapkan sebagai berikut.

  • Bendera:
    • | antarmuka | publik | abstrak tdWindowsRuntime (0x40A1), atau
    • | antarmuka NotPublic| | abstrak tdWindowsRuntime (0x40A0)
  • Nama: indeks ke dalam tabel string yang berisi nama antarmuka.
  • Namespace – indeks ke dalam tumpukan string yang berisi namespace jenis.
  • Extends: null.
  • FieldList: harus kosong.
  • MethodList: Indeks ke dalam tabel MethodDef, yang menandai eksekusi metode pertama yang berdampingan yang dimiliki oleh jenis ini. Spesifik tentang konten tabel MethodDef dirinci dalam subbagian dari bagian saat ini.

Baris TypeDef Antarmuka harus memiliki GuidAttribute serta VersionAttribute.

Setiap antarmuka WinRT dengan visibilitas privat harus memiliki satu ExclusiveToAttribute. Antarmuka WinRT apa pun dengan visibilitas publik tidak boleh memiliki ExclusiveToAttribute. Jika ada, ExclusiveToAttribute harus mereferensikan kelas runtime.

Antarmuka yang diperlukan untuk antarmuka diwakili oleh baris dalam tabel InterfaceImpl (ECMA II.22.23) dengan kolom yang ditetapkan sebagai berikut.

  • Kelas: indeks ke dalam tabel TypeDef untuk baris yang berisi antarmuka.
  • Antarmuka: indeks ke dalam tabel TypeDef, TypeRef, atau TypeSpec yang menentukan antarmuka yang diperlukan. Perhatikan, dalam file metadata yang disediakan sistem, ini tidak akan pernah menjadi TypeDef meskipun antarmuka yang diperlukan ditentukan dalam file metadata yang sama. Lihat bagian Pengalihan TypeDef untuk detail lebih lanjut.

Antarmuka berparameter

Antarmuka berparameter dengan persyaratan tambahan berikut.

Nama antarmuka berparameter ditambahkan dengan backtick dan angka yang menunjukkan jumlah parameter jenis yang dimiliki delegasi parameter. Misalnya, jenis Windows.Foundation.Collections.IVector<T> disimpan dalam metadata dengan nama Windows.Foundation.Collections.IVector'1.

Antarmuka berparameter memiliki satu baris dalam tabel GenericParam (ECMA II.22.20) untuk setiap parameter jenis dengan kolom yang ditetapkan sebagai berikut.

  • Angka: indeks parameter generik, bernomor kiri-ke-kanan, dimulai dari nol.
  • Bendera: Tidak ada.
  • Pemilik: Indeks ke dalam tabel TypeDef untuk baris yang berisi antarmuka.
  • Nama: Indeks ke dalam tumpukan string yang berisi nama parameter generik.

Tabel TypeSpec (ECMA II.23.2.14) digunakan untuk menentukan instans antarmuka berparameter. TypeSpecs ini kemudian dapat digunakan dalam tanda tangan metode dan implementasi antarmuka yang mirip dengan TypeRefs.

Anggota antarmuka

Parameter array

Saat mengodekan parameter Array untuk jenis anggota antarmuka apa pun, parameter panjang array yang segera mendahului parameter array dihilangkan dari blob MethodDefSig serta dari tabel params.

Arah parameter array dikodekan langsung dalam metadata. Arah parameter panjang array dapat disimpulkan sebagai berikut.

  • Jika parameter array adalah parameter dalam , parameter panjang array juga harus berupa parameter in.
  • Jika parameter array adalah parameter keluar dan tidak membawa penanda BYREF, panjang array adalah parameter in.
  • Jika parameter array adalah parameter keluar dan membawa penanda BYREF, panjang array adalah parameter keluar.

Metode

Untuk memodelkan proyeksi metode yang diharapkan dengan lebih baik serta kompatibilitas CLR, nilai pengembalian HRESULT yang diperlukan tidak dikodekan dalam metadata. Sebaliknya, parameter keluar yang akan digunakan sebagai nilai pengembalian dikodekan sebagai nilai pengembalian dalam methodDefSig. Untuk metode yang tidak mendeklarasikan parameter keluar yang akan digunakan sebagai nilai pengembalian, methodDefSig harus menyatakan jenis pengembalian menjadi batal (sesuai ECMA II.23.2.11).

Setiap metode pada antarmuka akan direpresentasikan sebagai baris dalam tabel MethodDef. Setiap baris methoddef akan berisi informasi berikut.

  • RVA: 0x00
  • ImplFlags: 0x00
  • Bendera: | publik | virtual HideBySig | | abstrak NewSlot | Instans (0x5c6)
  • Nama: indeks ke dalam tabel string yang berisi nama metode
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi jenis parameter dan jenis pengembalian metode. Jika antarmuka diparameterkan, blob MethodDefSig harus mereferensikan setiap parameter jenis antarmuka melalui Jenis yang dikodekan GENERICINST (sesuai ECMA II.23.2.12). Detail tentang antarmuka parameter yang harus diikuti.
  • ParamList: indeks ke dalam tabel Param (ECMA II.22.33) yang berisi yang pertama dalam eksekusi baris Param yang terkait dengan metode ini.

Setiap parameter metode (ditambah nilai pengembalian jika ditentukan) akan memiliki baris yang sesuai dalam tabel Param (ECMA II.22.33).

  • Bendera – tidak ada, masuk atau keluar yang sesuai untuk parameter .
    • Nilai yang dikembalikan selalu tidak ada
    • Parameter lain selalu masuk atau keluar
  • Urutan – urutan parameter.
    • Nol dicadangkan untuk nilai pengembalian metode
  • Nama – indeks ke dalam tumpukan string yang berisi nama parameter.

Setiap metode dapat secara opsional memiliki OverloadAttribute yang membawa nama metode unik (dalam cakupan antarmuka). Setiap metode dapat secara opsional memiliki DefaultOverloadAttribute yang menunjukkan metode yang kelebihan beban dari aritas yang sama (jumlah dalam parameter) harus diproyeksikan dalam bahasa yang lemah dan ditik secara dinamis.

Properti

Setiap properti pada antarmuka didefinisikan sebagai baris dalam tabel Properti (ECMA II.22.34), PropertyMap (ECMA II.22.35), MethodSemantics (ECMA II.22.28) dan MethodDef (ECMA II.22.26).

Setiap antarmuka dengan satu atau beberapa properti akan direpresentasikan sebagai baris tunggal dalam tabel PropertyMap yang berisi informasi berikut.

  • Induk: indeks ke dalam tabel TypeDef yang berisi antarmuka yang berisi properti.
  • PropertyList: indeks ke dalam tabel Properti yang berisi yang pertama dalam eksekusi baris yang terkait dengan jenis ini.

Setiap properti akan direpresentasikan sebagai baris tunggal dalam tabel Properti yang berisi informasi berikut

  • Bendera: Tidak ada.
  • Nama: indeks ke dalam tumpukan string yang berisi nama properti .
  • Jenis: indeks ke dalam tumpukan blob yang berisi blob PropertySig (ECMA II.23.2.5) yang berisi informasi jenis untuk properti.

Setiap Properti akan direpresentasikan sebagai satu atau dua baris dalam tabel MethodDef. Properti baca-saja direpresentasikan sebagai metode tunggal dengan awalan "get_", sementara properti baca/tulis direpresentasikan sebagai dua metode, satu dengan "get_" dan yang lainnya dengan awalan "put_". Tanda tangan untuk metode get tidak mengambil parameter dan mengembalikan nilai jenis properti. Tanda tangan untuk metode yang ditetapkan mengambil parameter tunggal dari jenis properti dan tidak mengembalikan apa pun.

Baris MethodDef untuk properti berisi yang berikut ini.

  • RVA: 0
  • ImplFlags: None
  • Bendera: | publik | virtual HideBySig | newSlot | | abstrak specialname (0xDC6)
  • Nama: indeks ke dalam tabel string yang berisi "get_<PropertyName>" atau "put_<PropertyName>" sebagaimana mestinya
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi jenis parameter dan jenis pengembalian metode seperti yang dijelaskan di atas.
  • ParamList: indeks ke dalam tabel Param (ECMA II.22.33) yang berisi yang pertama dalam eksekusi baris Param yang terkait dengan metode ini. Nilai dalam tabel Param seperti yang ditentukan di bawah metode di atas.

Setiap baris MethodDef untuk properti akan memiliki baris terkait dalam tabel MethodSemantics yang berisi informasi berikut.

  • Semantik: Getter atau Setter sebagaimana mewajibkan.
  • Metode: Indeks ke dalam tabel MethodDef yang berisi metode getter atau setter.
  • Asosiasi: Indeks ke dalam tabel Properti yang berisi properti .

Acara

Setiap peristiwa pada antarmuka didefinisikan sebagai baris dalam tabel Peristiwa (ECMA II.22.13), EventMap (ECMA II.22.12), MethodSemantics (ECMA II.22.28), dan MethodDef (ECMA II.22.26).

Setiap antarmuka dengan satu atau beberapa peristiwa akan direpresentasikan sebagai satu baris dalam tabel EventMap yang berisi informasi berikut.

  • Induk: indeks ke dalam tabel TypeDef yang berisi antarmuka yang berisi properti.
  • EventList: indeks ke dalam tabel Peristiwa yang berisi yang pertama dalam eksekusi baris yang terkait dengan jenis ini.

Setiap Peristiwa akan direpresentasikan sebagai satu baris dalam tabel Peristiwa yang berisi informasi berikut.

  • EventFlags: Tidak ada.
  • Nama: indeks ke dalam tumpukan string yang berisi nama properti .
  • EventType: TypeDefOrRef yang mengindeks ke dalam tabel yang sesuai yang berisi jenis delegasi peristiwa.

Setiap Peristiwa akan direpresentasikan sebagai dua baris dalam tabel MethodDef, satu dengan awalan "add_" untuk menambahkan pendengar peristiwa, dan satu dengan awalan "remove_" untuk menghapus pendengar peristiwa. Metode tambahkan mengambil instans delegasi dan mengembalikan Windows.Foundation.EventRegistrationToken yang mewakili pendaftaran peristiwa. Metode hapus mengambil EventRegistrationToken yang dikembalikan oleh metode tambahkan untuk membatalkan pendaftaran peristiwa.

Baris MethodDef untuk peristiwa berisi yang berikut ini.

  • RVA: 0
  • ImplFlags: None
  • Bendera: | publik | akhir | virtual hidebysig | | berita specialname (0x09e6)
  • Nama: indeks ke dalam tabel string yang berisi "add_<PropertyName>" atau "remove_<PropertyName>" sebagaimana mestinya.
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi parameter dan jenis pengembalian metode seperti yang dijelaskan di bawah ini.
    • metode Add_ mengambil parameter tunggal dari jenis delegasi dan mengembalikan Windows.Foundation.EventRegistrationToken.
    • metode Remove_ mengambil satu parameter Windows.Foundation.EventRegistrationToken dan tidak mengembalikan apa pun.
  • ParamList: indeks ke dalam tabel Param (ECMA II.22.33) yang berisi yang pertama dalam eksekusi baris Param yang terkait dengan metode . Nilai dalam tabel Param seperti yang ditentukan di bawah metode di atas.

Kedua baris MethodDef untuk peristiwa akan memiliki baris terkait dalam tabel MethodSemantics yang berisi informasi berikut.

  • Semantik: AddOn atau RemoveOn yang sesuai.
  • Metode: Indeks ke dalam tabel MethodDef yang berisi metode tambahkan atau hapus pendengar.
  • Asosiasi: Indeks ke dalam tabel Peristiwa yang berisi peristiwa.

Kelas runtime

Kelas Runtime diimplementasikan sebagai baris dalam tabel TypeDef (ECMA II.22.37) dengan kolom yang ditetapkan sebagai berikut.

  • Bendera: semua kelas runtime harus membawa bendera publik, tata letak otomatis, kelas, dan tdWindowsRuntime.
    • Hanya kelas statis yang membawa bendera abstrak. Semua kelas lain tidak membawa bendera abstrak.
    • Kelas yang tidak dapat disusun membawa bendera tertutup. Kelas yang dapat disusun tidak membawa bendera tertutup.
  • Nama: indeks ke dalam tabel string yang berisi nama kelas.
  • Namespace – indeks ke dalam tumpukan string yang berisi namespace jenis.
  • Memperluas: indeks ke dalam TypeRef yang mereferensikan kelas yang dapat disusun atau System.Object di mscorlib.
  • FieldList: harus kosong.
  • MethodList: Indeks ke dalam tabel MethodDef, yang menandai eksekusi metode pertama yang berdampingan yang dimiliki oleh jenis ini. Spesifik tentang konten tabel MethodDef dirinci di bawah ini.

Untuk semua kelas yang disediakan sistem, VersionAttribute harus ditambahkan ke baris TypeDef kelas.

Antarmuka yang diimplementasikan

Antarmuka yang diimplementasikan oleh kelas runtime diwakili oleh baris dalam tabel InterfaceImpl (ECMA II.22.23) dengan kolom yang ditetapkan sebagai berikut.

  • Kelas: indeks ke dalam tabel TypeDef untuk baris yang berisi jenis .
  • Antarmuka: indeks ke dalam tabel TypeDef, TypeRef, atau TypeSpec yang menentukan antarmuka yang diimplementasikan. Perhatikan, dalam file metadata yang disediakan sistem, ini tidak akan pernah menjadi TypeDef meskipun antarmuka yang diperlukan ditentukan dalam file metadata yang sama. Lihat bagian Pengalihan TypeDef untuk detail lebih lanjut.

Kelas runtime harus menentukan DefaultAttribute pada salah satu baris InterfaceImpl-nya.

Kelas runtime dapat menentukan OverridableAttribute atau ProtectedAttribute pada salah satu baris InterfaceImpl mereka. Mereka mungkin tidak menentukan OverridableAttribute dan ProtectedAttribute pada baris yang sama.

Secara opsional, VersionAttribute dapat ditambahkan ke salah satu baris interfaceImpl kelas. Nilai versi dari VersionAttribute pada baris interfaceImpl kelas apa pun harus lebih besar dari atau sama dengan nilai dari VersionAttribute pada baris TypeDef kelas.

Antarmuka statis

Kelas runtime memiliki nol atau lebih atribut kustom StaticAttribute. Secara hukum untuk menentukan lebih dari satu atribut kustom StaticAttribute, selama masing-masing memiliki parameter yang ditentukan berbeda. StaticAttribute apa pun akan muncul sebagai baris dalam tabel CustomAttribute dengan informasi berikut.

  • Induk: Kelas runtime yang dikaitkan dengan StaticAttribute.
  • Jenis: Referensi ke .ctor StaticAttribute.
  • Nilai: blob atribut kustom yang berisi parameter antarmuka statis System.Type dan parameter versi Uint32.

Aktivasi

Kelas runtime memiliki atribut kustom ActivatableAttribute nol atau lebih. Secara hukum untuk menentukan lebih dari satu atribut kustom ActivatableAttribute, selama masing-masing memiliki parameter yang ditentukan yang berbeda. Setiap ActivatableAttributes akan muncul sebagai baris dalam tabel CustomAttribute dengan informasi berikut.

  • Induk: Kelas runtime yang dikaitkan dengan ActivatableAttribute.
  • Jenis: Referensi ke salah satu dari dua .ctors ActivatableAttribute.
    • Aktivasi Langsung: .ctor hanya mengambil parameter versi Uint32.
    • Aktivasi pabrik: .ctor mengambil parameter antarmuka pabrik System.Type dan parameter versi Uint32.
  • Nilai: blob atribut kustom yang berisi parameter antarmuka pabrik System.Type (jika disediakan) dan parameter versi Uint32.

Komposisi

Kelas runtime memiliki nol atau lebih atribut kustom ComposableAttribute. Adalah legal untuk menentukan lebih dari satu atribut kustom ComposableAttribute, selama masing-masing memiliki parameter yang ditentukan yang berbeda. ComposableAttribute apa pun akan muncul sebagai baris dalam tabel CustomAttribute dengan informasi berikut.

  • Induk: Kelas runtime composableAttribute dikaitkan dengan .
  • Jenis: Referensi ke .ctor ComposableAttribute.
  • Nilai: blob atribut kustom yang berisi parameter antarmuka pabrik komposisi System.Type, nilai enum CompositionType (Publik atau Dilindungi) dan parameter versi Uint32.

Metode kelas

Kelas runtime memiliki baris dalam tabel MethodDef untuk setiap metode pada setiap antarmuka yang terkait dengan kelas . Ini termasuk antarmuka anggota (normal, dilindungi, dan dapat diganti), antarmuka statis, antarmuka pabrik aktivasi, dan antarmuka pabrik yang dapat dikomposisi. Selain itu, kelas yang mendukung aktivasi langsung juga akan memiliki baris dalam tabel MethodDef untuk menunjukkan hal ini.

Anggota antarmuka anggota

Setiap metode dari antarmuka anggota (termasuk antarmuka yang dilindungi dan dapat diganti) diwakili oleh baris dalam tabel MethodDef kelas. Tabel methodDef kelas berisi salinan informasi MethodDef yang tepat dari antarmuka deklarasi asli, termasuk baris tabel Param dan atribut kustom, dengan pengecualian berikut.

  • Kelas runtime dapat menentukan nama alternatif untuk metode yang ditentukan pada antarmuka anggota.
  • Metode pada kelas runtime tidak mendapatkan bendera Abstrak.
  • Metode pada kelas runtime mendapatkan bendera Runtime MethodImpl.
  • Metode dari antarmuka yang tidak dapat diganti juga mendapatkan bendera Final. Metode dari antarmuka yang dapat diganti tidak mendapatkan bendera Akhir.

Setiap baris dalam tabel MethodDef kelas dari antarmuka anggota terhubung kembali ke metode antarmuka yang awalnya mendefinisikan metode melalui entri dalam tabel MethodImpl (ECMA II.22.27) dengan nilai sebagai berikut.

  • Kelas – indeks ke dalam tabel TypeDef yang mereferensikan kelas yang membawa metode (catatan, indeks ini tidak tunduk pada Pengalihan TypeDef).
  • MethodBody – Indeks ke dalam tabel MethodDef yang mereferensikan metode kelas.
  • MethodDeclaration – indeks ke dalam tabel MethodDef atau MemberRef yang mereferensikan metode antarmuka yang awalnya dinyatakan.
Anggota antarmuka statis

Setiap metode dari antarmuka statis diwakili oleh baris dalam tabel MethodDef kelas. Tabel methodDef kelas berisi salinan informasi MethodDef yang tepat dari antarmuka deklarasi asli, termasuk baris tabel Param dan atribut kustom, dengan pengecualian berikut.

  • Anggota statis tidak mendapatkan bendera Virtual, Abstract, NewSlot, dan Instance.
  • Anggota statis memang mendapatkan bendera Statis dan Kelas.
  • Metode Statis pada kelas runtime mendapatkan bendera Runtime MethodImpl.
Anggota aktivasi

Kelas yang mendukung aktivasi langsung tanpa parameter memiliki baris konstruktor dalam tabel MethodDef kelas dengan nilai kolom berikut.

  • RVA: 0x00
  • ImplFlags: Runtime
  • Bendera: | publik HideBySig | | SpecialName | RTSpecialName Sebagai contoh
  • Nama: indeks ke dalam tabel string yang berisi ".ctor"
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang tidak berisi parameter dan mengembalikan null
  • ParamList: harus kosong

Kelas yang mendukung aktivasi pabrik memiliki baris konstruktor dalam tabel MethodDef kelas untuk setiap metode di setiap antarmuka pabrik yang diimplementasikan dengan nilai kolom berikut.

  • RVA: 0x00
  • ImplFlags: Runtime
  • Bendera: | publik HideBySig | | SpecialName RTSpecialName | Sebagai contoh
  • Nama: indeks ke dalam tabel string yang berisi ".ctor".
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi parameter input dan mengembalikan null.
  • ParamList: pointer ke dalam tabel Params dengan baris untuk setiap parameter, disalin persis dari tabel params untuk metode pabrik yang awalnya mendeklarasikan.
Anggota komposisi

Kelas yang mendukung aktivasi pabrik komposisi memiliki baris konstruktor dalam tabel MethodDef kelas untuk setiap metode di setiap antarmuka pabrik yang diimplementasikan dengan nilai kolom berikut.

  • RVA: 0x00
  • ImplFlags: Runtime
  • Bendera: | publik HideBySig | | SpecialName RTSpecialName | Sebagai contoh
  • Nama: indeks ke dalam tabel string yang berisi ".ctor".
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi parameter input kustom dan mengembalikan null. Parameter IInspectable* [in] yang mengontrol dan parameter IInspectable** [out] yang tidak mendelegasikan tidak tercermin dalam tanda tangan metode.
  • ParamList: penunjuk ke dalam tabel Params dengan baris untuk setiap parameter kecuali parameter IInspectable* [in] yang mengontrol dan parameter non-delegasi IInspectable** [out], disalin persis dari tabel params untuk metode pabrik yang awalnya mendeklarasikan.

Mengelola atribut kustom

Atribut kustom memiliki metode konstruktor nol atau lebih, masing-masing dengan parameter nol atau lebih di mana jenis parameter terbatas pada jenis dasar, enum, dan System.Type. Setiap konstruktor dalam atribut kustom muncul sebagai baris di MethodDef dengan informasi berikut.

  • RVA (alias Alamat Virtual Relatif): null
  • ImplFlags: Tidak ada
  • Bendera: | publik HideBySig | | specalname RTSpecialName (0x1886)
  • Nama: indeks ke dalam tabel string yang berisi nama ".ctor".
  • Tanda tangan: indeks ke dalam tumpukan blob yang berisi blob MethodDefSig (ECMA II.23.2.1) yang berisi jenis parameter dan jenis pengembalian metode.
  • ParamList: indeks ke dalam tabel Param (ECMA II.22.33) yang berisi yang pertama dalam eksekusi baris Param yang terkait dengan metode ini.

Atribut kustom pada konstruksi metadata disimpan sebagai baris dalam tabel CustomAttribute (ECMA II.22.10) dengan kolom yang ditetapkan sebagai berikut.

  • Induk: indeks ke dalam tabel metadata tempat atribut kustom dilampirkan.
  • Jenis: indeks ke dalam tabel MethodDef atau MemberRef yang berisi referensi ke konstruktor jenis atribut.
  • Nilai: indeks ke dalam tumpukan blob yang berisi parameter atribut posisional dan bernama (ECMA II.23.2). Perhatikan, karena atribut kustom WinRT tidak diizinkan untuk memiliki properti, blob atribut kustom tidak akan pernah berisi gaya PROPERTI bernama argumen.