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

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.