Mendiagnosis kesalahan komponen C#/WinRT
Artikel ini menyediakan informasi tambahan tentang pembatasan Pada Komponen Runtime Windows yang ditulis dengan C#/WinRT. Ini meluas pada informasi yang disediakan dalam pesan kesalahan dari C#/WinRT saat penulis membangun komponen mereka. Untuk komponen terkelola UWP .NET Native yang ada, metadata untuk komponen C# WinRT dihasilkan menggunakan Winmdexp.exe, alat .NET. Sekarang setelah dukungan Windows Runtime dipisahkan dari .NET, C#/WinRT menyediakan alat untuk menghasilkan file .winmd dari komponen Anda. Windows Runtime memiliki lebih banyak batasan pada kode daripada pustaka kelas C#, dan C#/WinRT Diagnostic Scanner memberi tahu Anda tentang hal ini sebelum membuat file .winmd.
Artikel ini membahas kesalahan yang dilaporkan dalam build Anda dari C#/WinRT. Artikel ini berfungsi sebagai versi informasi terbaru tentang pembatasan untuk komponen terkelola UWP .NET Native yang ada yang menggunakan alat Winmdexp.exe.
Cari teks pesan kesalahan (menghilangkan nilai tertentu untuk tempat penampung) atau nomor pesan. Jika Anda tidak menemukan informasi yang Anda butuhkan di sini, Anda dapat membantu kami meningkatkan dokumentasi dengan menggunakan tombol umpan balik di akhir artikel ini. Dalam umpan balik Anda, harap sertakan pesan kesalahan. Atau, Anda dapat mengajukan bug di repositori C#/WinRT.
Artikel ini mengatur pesan kesalahan berdasarkan skenario.
Menerapkan antarmuka yang bukan antarmuka Windows Runtime yang valid
Komponen C#/WinRT tidak dapat menerapkan antarmuka Windows Runtime tertentu, seperti antarmuka Windows Runtime yang mewakili tindakan atau operasi asinkron (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult>, atau IAsyncOperationWithProgress<TResult,TProgress).> Sebagai gantinya , gunakan kelas AsyncInfo untuk menghasilkan operasi asinkron di komponen Windows Runtime. Catatan: ini bukan satu-satunya antarmuka yang tidak valid, misalnya kelas tidak dapat menerapkan System.Exception.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1008 |
Tipe {0} komponen Windows Runtime tidak dapat menerapkan antarmuka {1}, karena antarmuka bukan antarmuka Windows Runtime yang valid |
Kesalahan terkait atribut
Di Windows Runtime, metode yang kelebihan beban dapat memiliki jumlah parameter yang sama hanya jika satu kelebihan beban ditentukan sebagai kelebihan beban default. Gunakan atribut Windows.Foundation.Metadata.DefaultOverload (CsWinRT1015, 1016).
Ketika array digunakan sebagai input atau output baik dalam fungsi atau properti, array harus baca-saja atau tulis-saja (CsWinRT 1025). Atribut System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArray dan System.Runtime.InteropServices.WindowsRuntime.WriteOnlyArray disediakan untuk Anda gunakan. Atribut yang disediakan hanya untuk digunakan pada parameter jenis array (CsWinRT1026), dan hanya satu yang harus diterapkan per parameter (CsWinRT1023).
Anda tidak perlu menerapkan atribut apa pun ke parameter array yang ditandai, karena diasumsikan hanya untuk menulis. Ada pesan kesalahan jika Anda menghiasnya sebagai baca-saja dalam kasus ini (CsWinRT1024).
Atribut System.Runtime.InteropServices.InAttribute dan System.Runtime.InteropServices.OutAttribute tidak boleh digunakan pada parameter jenis apa pun (CsWinRT1021,1022).
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1015 |
Di kelas {2}: Beberapa {0}kelebihan parameter '{1}' dihiasi dengan Windows.Foundation.Metadata.DefaultOverloadAttribute. Atribut hanya dapat diterapkan ke satu kelebihan metode. |
CsWinRT1016 |
Di kelas {2}: Kelebihan {0}parameter harus memiliki tepat satu metode yang ditentukan sebagai kelebihan beban default dengan menghiasnya {1} dengan atribut Windows.Foundation.Metadata.DefaultOverloadAttribute. |
CsWinRT1021 |
Metode '{0}' memiliki parameter '{1}' yang merupakan array, dan yang memiliki System.Runtime.InteropServices.InAttribute atau System.Runtime.InteropServices.OutAttribute. Di Windows Runtime, parameter array harus memiliki ReadOnlyArray atau WriteOnlyArray. Hapus atribut ini atau ganti dengan atribut Windows Runtime yang sesuai jika perlu. |
CsWinRT1022 |
Metode '{0}' memiliki parameter '{1}' dengan System.Runtime.InteropServices.InAttribute atau System.Runtime.InteropServices.OutAttribute.Windows Runtime tidak mendukung penandaan parameter dengan System.Runtime.InteropServices.InAttribute atau System.Runtime.InteropServices.OutAttribute. Harap pertimbangkan untuk menghapus System.Runtime.InteropServices.InAttribute dan ganti System.Runtime.InteropServices.OutAttribute dengan pengubah 'out'. |
CsWinRT1023 |
Metode '{0}' memiliki parameter '{1}' yang merupakan array, dan yang memiliki ReadOnlyArray dan WriteOnlyArray. Di Windows Runtime, parameter array konten harus dapat dibaca atau dapat ditulis. Hapus salah satu atribut dari '{1}'. |
CsWinRT1024 |
Metode '{0}' memiliki parameter output '{1}' yang merupakan array, tetapi yang memiliki atribut ReadOnlyArray. Di Windows Runtime, konten array output dapat ditulis. Hapus atribut dari '{1}'. |
CsWinRT1025 |
Metode '{0}' memiliki parameter '{1}' yang merupakan array. Dalam Windows Runtime, konten parameter array harus dapat dibaca atau dapat ditulis. Silakan terapkan ReadOnlyArray atau WriteOnlyArray ke '{1}'. |
CsWinRT1026 |
Metode '{0}' memiliki parameter '{1}' yang bukan array, dan yang memiliki atribut ReadOnlyArray atau atribut WriteOnlyArray. Windows Runtime tidak mendukung penandaan parameter non-array dengan ReadOnlyArray atau WriteOnlyArray." |
Kesalahan namespace dan nama yang tidak valid untuk file output
Di Windows Runtime, semua jenis publik dalam file metadata Windows (.winmd) harus berada di namespace yang berbagi nama file .winmd, atau di sub-namespace nama file. Misalnya, jika proyek Visual Studio Anda bernama A.B (yaitu, komponen Windows Runtime Anda adalah A.B.winmd), proyek tersebut dapat berisi kelas publik A.B.Class1 dan A.B.C.Class2, tetapi bukan A.Class3 atau D.Class4.
Catatan
Pembatasan ini hanya berlaku untuk jenis publik, bukan untuk jenis privat yang digunakan dalam implementasi Anda.
Dalam kasus A.Class3, Anda dapat memindahkan Class3 ke namespace layanan lain atau mengubah nama komponen Windows Runtime menjadi A.winmd. Dalam contoh sebelumnya, kode yang memanggil A.B.winmd tidak akan dapat menemukan A.Class3.
Dalam kasus D.Class4, tidak ada nama file yang dapat berisi D.Class4 dan kelas di namespace layanan A.B, sehingga mengubah nama komponen Windows Runtime bukanlah opsi. Anda dapat memindahkan D.Class4 ke namespace layanan lain, atau meletakkannya di komponen Windows Runtime lain.
Sistem file tidak dapat membedakan antara huruf besar dan huruf kecil, sehingga namespace yang berbeda menurut kasus tidak diizinkan (CsWinRT1002).
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1001 |
Jenis publik memiliki namespace layanan ('{1}') yang tidak berbagi awalan umum dengan namespace layanan lain ('{0}'). Semua tipe dalam file Metadata Windows harus ada di sub namespace namespace layanan yang tersirat oleh nama file. |
CsWinRT1002 |
Beberapa namespace yang ditemukan dengan nama '{0}'; nama namespace tidak dapat berbeda hanya menurut kasus dalam Windows Runtime. |
Mengekspor tipe yang bukan tipe Windows Runtime yang valid
Antarmuka publik komponen Anda hanya boleh mengekspos jenis Windows Runtime. Namun, .NET menyediakan pemetaan untuk sejumlah jenis yang umum digunakan yang sedikit berbeda di .NET dan Windows Runtime. Ini memungkinkan pengembang .NET untuk bekerja dengan jenis yang sudah dikenal alih-alih mempelajari yang baru. Anda dapat menggunakan jenis .NET Framework yang dipetakan ini di antarmuka publik komponen Anda. Untuk informasi selengkapnya, lihat Mendeklarasikan jenis di Komponen Runtime Windows, Meneruskan jenis Windows Runtime ke kode terkelola, dan pemetaan .NET jenis Windows Runtime.
Banyak dari pemetaan ini adalah antarmuka. Misalnya, IList<T> memetakan ke antarmuka Windows Runtime IVector<T>. Jika Anda menggunakan string> Daftar<alih-alih string> IList<sebagai jenis parameter, C#/WinRT menyediakan daftar alternatif yang menyertakan semua antarmuka yang dipetakan yang diterapkan oleh Daftar<T>. Jika Anda menggunakan jenis generik berlapis, seperti int Kamus<Daftar<, string>>, C#/WinRT menawarkan pilihan untuk setiap tingkat bersarang. Daftar ini bisa menjadi cukup panjang.
Secara umum, pilihan terbaik adalah antarmuka yang paling dekat dengan jenisnya. Misalnya, untuk Kamus<int, string>, pilihan terbaik kemungkinan besar adalah int IDictionary<, string>.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1006 |
Anggota '{0}' memiliki jenis '{1}' dalam tanda tangannya. Tipe '{1}' bukan tipe Windows Runtime yang valid. Namun, jenis (atau parameter umumnya) mengimplementasikan antarmuka yang merupakan jenis Windows Runtime yang valid. Pertimbangkan untuk mengubah jenis '{1} dalam tanda tangan anggota ke salah satu jenis berikut dari System.Collections.Generic: {2}. |
Di Windows Runtime, array dalam tanda tangan anggota harus satu dimensi dengan batas bawah 0 (nol). Jenis array berlapis seperti myArray[][]
(CsWinRT1017) dan myArray[,]
(CsWinRT1018) tidak diizinkan.
Catatan
Pembatasan ini tidak berlaku untuk array yang Anda gunakan secara internal dalam implementasi Anda.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1017 |
Metode {0} memiliki array berlapis jenis {1} dalam tanda tangannya. Array dalam tanda tangan metode Runtime Windows tidak dapat ditumpuk. |
CsWinRT1018 |
Metode '{0}' memiliki array multi-dimensi jenis '{1}' dalam tanda tangannya. Array dalam tanda tangan metode Windows Runtime harus satu dimensi. |
Struktur yang berisi bidang tipe yang tidak diizinkan
Di Windows Runtime, struktur hanya dapat berisi bidang, dan hanya struktur yang dapat berisi bidang. Bidang-bidang tersebut harus publik. Jenis bidang yang valid termasuk enumerasi, struktur, dan jenis primitif.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1007 |
Struktur {0} tidak berisi bidang publik. Struktur Windows Runtime harus berisi setidaknya satu bidang publik. |
CsWinRT1011 |
Struktur {0} memiliki bidang non-publik. Semua bidang harus publik untuk struktur Windows Runtime. |
CsWinRT1012 |
Struktur {0} memiliki bidang const. Konstanta hanya dapat muncul pada enumerasi Windows Runtime. |
CsWinRT1013 |
Struktur {0} memiliki bidang tipe {1}; {1} bukan tipe bidang Windows Runtime yang valid. Setiap bidang dalam struktur Windows Runtime hanya boleh UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum, atau struktur itu sendiri. |
Nama parameter berkonflik dengan kode yang dihasilkan
Di Windows Runtime, nilai pengembalian dianggap sebagai parameter output, dan nama parameter harus unik. Secara default, C#/WinRT memberi nilai pengembalian nama __retval
. Jika metode Anda memiliki parameter bernama __retval
, Anda akan mendapatkan kesalahan CsWinRT1010. Untuk memperbaikinya, beri nama parameter Anda selain __retvalue
.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1010 |
Nama {1} parameter dalam metode {0} sama dengan nama parameter nilai pengembalian yang digunakan dalam interop C#/WinRT yang dihasilkan; gunakan nama parameter yang berbeda. |
Lain-lain
Pembatasan lain dalam komponen yang ditulis C#/WinRT meliputi:
- Anda tidak dapat mengekspos operator yang kelebihan beban pada jenis publik.
- Kelas dan antarmuka tidak boleh generik.
- Kelas harus disegel.
- Parameter tidak dapat diteruskan oleh referensi, misalnya menggunakan kata kunci ref .
- Properti harus memiliki metode get publik.
- Setidaknya harus ada satu jenis publik (kelas atau antarmuka) di namespace komponen Anda.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1014 |
'{0}' adalah kelebihan beban operator. Jenis terkelola tidak dapat mengekspos kelebihan beban operator di Windows Runtime. |
CsWinRT1004 |
Jenisnya {0} generik. Tipe Windows Runtime tidak bisa generik. |
CsWinRT1005 |
Mengekspor jenis yang tidak tersegel tidak didukung di CsWinRT. Harap tandai jenis {0} sebagai disegel. |
CsWinRT1020 |
Metode '{0}' memiliki parameter '{1}' bertanda 'ref'. Parameter referensi tidak diperbolehkan dalam Windows Runtime. |
CsWinRT1000 |
Properti '{0}' tidak memiliki metode getter publik. Windows Runtime tidak mendukung properti khusus setter. |
CsWinRT1003 |
Komponen Windows Runtime harus memiliki setidaknya satu tipe publik |
Di Windows Runtime, kelas hanya dapat memiliki satu konstruktor dengan sejumlah parameter tertentu. Misalnya, Anda tidak dapat memiliki satu konstruktor yang memiliki satu parameter string jenis dan konstruktor lain yang memiliki satu parameter jenis int. Satu-satunya solusi adalah menggunakan jumlah parameter yang berbeda untuk setiap konstruktor.
Nomor kesalahan |
Teks pesan |
---|---|
CsWinRT1009 |
Kelas tidak dapat memiliki beberapa konstruktor dengan aritas yang sama di Windows Runtime, kelas {0} memiliki beberapa {1}konstruktor -aritas. |
Windows developer
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk