Windows komponen Runtime dengan C# dan Visual Basic

Anda dapat menggunakan kode terkelola untuk membuat jenis runtime Windows Anda sendiri dan mengemasnya dalam komponen Windows Runtime. Anda dapat menggunakan komponen Anda di aplikasi Universal Windows Platform (UWP) yang ditulis dalam C++, JavaScript, Visual Basic, atau C#. Topik ini menguraikan aturan untuk membuat komponen, dan membahas beberapa aspek dukungan .NET untuk Windows Runtime. Secara umum, dukungan tersebut dirancang agar transparan terhadap programmer .NET. Namun, ketika Anda membuat komponen untuk digunakan dengan JavaScript atau C++, Anda perlu mengetahui perbedaan dalam cara bahasa tersebut mendukung Windows Runtime.

Jika Anda membuat komponen untuk digunakan hanya di aplikasi UWP yang ditulis dalam Visual Basic atau C#, dan komponen tidak berisi kontrol UWP, maka pertimbangkan untuk menggunakan templat Pustaka Kelas alih-alih templat proyek Komponen Runtime Windows di Microsoft Visual Studio. Ada lebih sedikit batasan pada pustaka kelas sederhana.

Catatan

Untuk pengembang C# yang menulis aplikasi desktop di .NET 6 atau yang lebih baru, gunakan C#/WinRT untuk menulis komponen Windows Runtime. Lihat Menulis Windows komponen Runtime dengan C#/WinRT.

Mendeklarasikan jenis dalam komponen runtime Windows

Secara internal, jenis Windows Runtime di komponen Anda dapat menggunakan fungsionalitas .NET apa pun yang diizinkan di aplikasi UWP. Untuk informasi selengkapnya, lihat .NET untuk aplikasi UWP.

Secara eksternal, anggota jenis Anda hanya dapat mengekspos jenis runtime Windows untuk parameter dan nilai yang dikembalikan. Daftar berikut ini menjelaskan batasan pada jenis .NET yang diekspos dari komponen Windows Runtime.

  • Bidang, parameter, dan nilai pengembalian semua jenis publik dan anggota dalam komponen Anda harus Windows jenis Runtime. Pembatasan ini mencakup jenis Windows Runtime yang Anda tulis serta jenis yang disediakan oleh Windows Runtime itu sendiri. Ini juga mencakup sejumlah jenis .NET. Penyertaan jenis ini adalah bagian dari dukungan yang disediakan .NET untuk memungkinkan penggunaan alami runtime Windows dalam kode terkelola—kode Anda tampaknya menggunakan jenis .NET yang sudah dikenal alih-alih jenis Runtime Windows yang mendasarinya. Misalnya, Anda dapat menggunakan jenis primitif .NET seperti Int32 dan Double, jenis dasar tertentu seperti DateTimeOffset dan Uri, dan beberapa jenis antarmuka generik yang umum digunakan seperti IEnumerable<T> (IEnumerable(Of T) di Visual Basic) dan IDictionary<TKey,TValue>. Perhatikan bahwa argumen jenis dari jenis generik ini harus Windows jenis Runtime. Ini dibahas di bagian Meneruskan jenis Runtime Windows ke kode terkelola dan Meneruskan jenis terkelola ke Windows Runtime, nanti dalam topik ini.

  • Kelas dan antarmuka publik dapat berisi metode, properti, dan peristiwa. Anda dapat mendeklarasikan delegasi untuk acara Anda, atau menggunakan delegasi EventHandler<T> . Kelas atau antarmuka publik tidak dapat:

    • Jadilah generik.
    • Terapkan antarmuka yang bukan antarmuka Windows Runtime (namun, Anda dapat membuat antarmuka Windows Runtime Anda sendiri dan mengimplementasikannya).
    • Berasal dari jenis yang tidak ada di Windows Runtime, seperti System.Exception dan System.EventArgs.
  • Semua jenis publik harus memiliki namespace layanan akar yang cocok dengan nama rakitan, dan nama rakitan tidak boleh dimulai dengan "Windows".

    Tip. Secara default, proyek Visual Studio memiliki nama namespace yang cocok dengan nama rakitan. Di Visual Basic, pernyataan Namespace untuk namespace default ini tidak ditampilkan dalam kode Anda.

  • Struktur publik tidak boleh memiliki anggota selain bidang publik, dan bidang tersebut harus berupa jenis nilai atau string.

  • Kelas publik harus disegel (NotInheritable dalam Visual Basic). Jika model pemrograman Anda memerlukan polimorfisme, maka Anda dapat membuat antarmuka publik, dan mengimplementasikan antarmuka tersebut pada kelas yang harus polimorfik.

Men-debug komponen Anda

Jika aplikasi UWP dan komponen Anda dibuat dengan kode terkelola, Maka Anda dapat men-debug keduanya secara bersamaan.

Saat menguji komponen sebagai bagian dari aplikasi UWP menggunakan C++, Anda dapat men-debug kode terkelola dan asli secara bersamaan. Defaultnya hanya kode asli.

Untuk men-debug kode C++ asli dan kode terkelola

  1. Buka menu pintasan untuk proyek Visual C++Anda, dan pilih Properti.
  2. Di halaman properti, di bawah Properti Konfigurasi, pilih Debugging.
  3. Pilih Jenis Debugger, dan dalam kotak daftar drop-down ubah Hanya Asli menjadi Campuran (Terkelola dan Asli). Pilih OK.
  4. Atur titik henti dalam kode asli dan terkelola.

Saat Anda menguji komponen sebagai bagian dari aplikasi UWP menggunakan JavaScript, secara default solusinya berada dalam mode penelusuran kesalahan JavaScript. Dalam Visual Studio, Anda tidak dapat men-debug JavaScript dan kode terkelola secara bersamaan.

Untuk men-debug kode terkelola, bukan JavaScript

  1. Buka menu pintasan untuk proyek JavaScript Anda, dan pilih Properti.
  2. Di halaman properti, di bawah Properti Konfigurasi, pilih Debugging.
  3. Pilih Jenis Debugger, dan dalam kotak daftar turun bawah ubah Skrip Saja menjadi Hanya Terkelola. Pilih OK.
  4. Atur titik henti dalam kode terkelola dan debug seperti biasa.

Meneruskan jenis runtime Windows ke kode terkelola

Seperti disebutkan sebelumnya di bagian Mendeklarasikan jenis dalam komponen Windows Runtime, jenis .NET tertentu dapat muncul di tanda tangan anggota kelas publik. Ini adalah bagian dari dukungan yang disediakan .NET untuk memungkinkan penggunaan alami Windows Runtime dalam kode terkelola. Ini termasuk jenis primitif dan beberapa kelas dan antarmuka. Saat komponen Anda digunakan dari JavaScript, atau dari kode C++, penting untuk mengetahui bagaimana jenis .NET Anda muncul ke pemanggil. Lihat Panduan membuat komponen C# atau Visual Basic Windows Runtime, dan memanggilnya dari JavaScript misalnya dengan JavaScript. Bagian ini membahas jenis yang umum digunakan.

Dalam .NET, jenis primitif seperti struktur Int32 memiliki banyak properti dan metode yang berguna, seperti metode TryParse . Sebaliknya, jenis dan struktur primitif di Windows Runtime hanya memiliki bidang. Ketika Anda meneruskan jenis ini ke kode terkelola, jenis tersebut tampaknya adalah jenis .NET, dan Anda dapat menggunakan properti dan metode jenis .NET seperti biasa. Daftar berikut ini meringkas substitusi yang dibuat secara otomatis dalam IDE:

  • Untuk Windows Runtime primitif Int32, Int64, Single, Double, Boolean, String (koleksi karakter Unicode yang tidak dapat diubah), Enum, UInt32, UInt64, dan Guid, gunakan jenis nama yang sama di namespace layanan Sistem.
  • Untuk UInt8, gunakan System.Byte.
  • Untuk Char16, gunakan System.Char.
  • Untuk antarmuka IInspectable , gunakan System.Object.

Jika C# atau Visual Basic menyediakan kata kunci bahasa untuk salah satu jenis ini, maka Anda dapat menggunakan kata kunci bahasa sebagai gantinya.

Selain jenis primitif, beberapa jenis Runtime Windows dasar yang umum digunakan muncul dalam kode terkelola sebagai setara .NET mereka. Misalnya, kode JavaScript Anda menggunakan Windows. Kelas Foundation.Uri, dan Anda ingin meneruskannya ke metode C# atau Visual Basic. Jenis yang setara dalam kode terkelola adalah kelas .NET System.Uri , dan itulah jenis yang digunakan untuk parameter metode. Anda dapat mengetahui kapan jenis Runtime Windows muncul sebagai jenis .NET, karena IntelliSense di Visual Studio menyembunyikan jenis runtime Windows saat Anda menulis kode terkelola, dan menyajikan jenis .NET yang setara. (Biasanya kedua jenis tersebut memiliki nama yang sama. Namun, perhatikan bahwa Windows. Struktur Foundation.DateTime muncul dalam kode terkelola sebagai System.DateTimeOffset dan bukan sebagai System.DateTime.)

Untuk beberapa jenis koleksi yang umum digunakan, pemetaan adalah antara antarmuka yang diimplementasikan oleh jenis runtime Windows dan antarmuka yang diimplementasikan oleh jenis .NET yang sesuai. Seperti jenis yang disebutkan di atas, Anda mendeklarasikan jenis parameter dengan menggunakan jenis .NET. Ini menyembunyikan beberapa perbedaan antara jenis dan membuat penulisan kode .NET lebih alami.

Tabel berikut mencantumkan yang paling umum dari jenis antarmuka generik ini, bersama dengan pemetaan kelas dan antarmuka umum lainnya. Untuk daftar lengkap jenis Windows Runtime yang dipetakan .NET, lihat pemetaan .NET dari jenis Windows Runtime.

runtime Windows .NET
IIterable<T> IEnumerable<T>
IVector<T> IList<T>
IVectorView<T> IReadOnlyList<T>
IMap<K, V> TKey Kamus<, TValue>
IMapView<K, V> IReadOnlyDictionary<TKey, TValue>
IKeyValuePair<K, V> KeyValuePair<TKey, TValue>
IBindableIterable IEnumerable
IBindableVector IList
Windows. UI. Xaml.Data.INotifyPropertyChanged System.ComponentModel.INotifyPropertyChanged
Windows. UI. Xaml.Data.PropertyChangedEventHandler System.ComponentModel.PropertyChangedEventHandler
Windows. UI. Xaml.Data.PropertyChangedEventArgs System.ComponentModel.PropertyChangedEventArgs

Saat jenis mengimplementasikan lebih dari satu antarmuka, Anda dapat menggunakan salah satu antarmuka yang diterapkannya sebagai jenis parameter atau mengembalikan jenis anggota. Misalnya, Anda dapat meneruskan atau mengembalikan int Kamus<, string> (Kamus(Bilangan Bulat, String) dalam Visual Basic) sebagai int<, string>,IReadOnlyDictionary<int, string>, atau IEnumerable<System.Collections.Generic.KeyValuePair<TKey, TValue>>.

Penting

JavaScript menggunakan antarmuka yang muncul terlebih dahulu dalam daftar antarmuka yang diterapkan jenis terkelola. Misalnya, jika Anda mengembalikan int Kamus<, string> ke kode JavaScript, itu muncul sebagai int IDictionary<, string> apa pun antarmuka mana yang Anda tentukan sebagai jenis pengembalian. Ini berarti bahwa jika antarmuka pertama tidak menyertakan anggota yang muncul di antarmuka selanjutnya, anggota tersebut tidak terlihat oleh JavaScript.

Dalam Windows Runtime, IMap<K, V> danIMapView<K, V> diulang dengan menggunakan IKeyValuePair. Ketika Anda meneruskannya ke kode terkelola, kode tersebut muncul sebagai TKey IDictionary<, TValue> dan IReadOnlyDictionary<TKey, TValue>, jadi secara alami Anda menggunakan System.Collections.Generic.KeyValuePair<TKey, TValue> untuk menghitungnya.

Cara antarmuka muncul dalam kode terkelola memengaruhi cara jenis yang mengimplementasikan antarmuka ini muncul. Misalnya, kelas PropertySet mengimplementasikan IMap<K, V>, yang muncul dalam kode terkelola sebagai IDictionary<TKey, TValue>. PropertySet muncul seolah-olah menerapkan TKey IDictionary<, TValue> alih-alih IMap<K, V>, jadi dalam kode terkelola tampaknya memiliki metode Tambahkan , yang berperilaku seperti metode Tambahkan pada kamus .NET. Tampaknya tidak memiliki metode Sisipkan . Anda dapat melihat contoh ini dalam topik Panduan pembuatan komponen C# atau Visual Basic Windows Runtime, dan memanggilnya dari JavaScript.

Meneruskan jenis terkelola ke Windows Runtime

Seperti yang dibahas di bagian sebelumnya, beberapa jenis Windows Runtime dapat muncul sebagai jenis .NET di tanda tangan anggota komponen Anda, atau dalam tanda tangan anggota Windows Runtime saat Anda menggunakannya di IDE. Saat Anda meneruskan jenis .NET ke anggota ini atau menggunakannya sebagai nilai pengembalian anggota komponen Anda, mereka muncul ke kode di sisi lain sebagai jenis runtime Windows yang sesuai. Untuk contoh efek yang dapat terjadi saat komponen Anda dipanggil dari JavaScript, lihat bagian "Mengembalikan jenis terkelola dari komponen Anda" di Panduan membuat komponen C# atau Visual Basic Windows Runtime, dan memanggilnya dari JavaScript.

Metode yang kelebihan beban

Dalam Windows Runtime, metode dapat kelebihan beban. Namun, jika Anda menyatakan beberapa kelebihan beban dengan jumlah parameter yang sama, Anda harus menerapkan Windows. Atribut Foundation.Metadata.DefaultOverloadAttribute hanya untuk salah satu kelebihan beban tersebut. Kelebihan beban itu adalah satu-satunya yang dapat Anda panggil dari JavaScript. Misalnya, dalam kode berikut kelebihan beban yang mengambil int (Bilangan bulat dalam Visual Basic) adalah kelebihan beban default.

public string OverloadExample(string s)
{
    return s;
}

[Windows.Foundation.Metadata.DefaultOverload()]
public int OverloadExample(int x)
{
    return x;
}
Public Function OverloadExample(ByVal s As String) As String
    Return s
End Function

<Windows.Foundation.Metadata.DefaultOverload> _
Public Function OverloadExample(ByVal x As Integer) As Integer
    Return x
End Function

[PENTING] JavaScript memungkinkan Anda meneruskan nilai apa pun ke OverloadExample, dan memaksa nilai ke jenis yang diperlukan oleh parameter . Anda dapat memanggil OverloadExample dengan "empat puluh dua", "42", atau 42,3, tetapi semua nilai tersebut diteruskan ke kelebihan beban default. Kelebihan beban default dalam contoh sebelumnya masing-masing mengembalikan 0, 42, dan 42.

Anda tidak dapat menerapkan atribut e DefaultOverloadAttributke konstruktor. Semua konstruktor di kelas harus memiliki jumlah parameter yang berbeda.

Menerapkan IStringable

Dimulai dengan Windows 8.1, Windows Runtime menyertakan antarmuka IStringable yang metode tunggalnya, IStringable.ToString, menyediakan dukungan pemformatan dasar sebanding dengan yang disediakan oleh Object.ToString. Jika Anda memilih untuk menerapkan IStringable dalam jenis terkelola publik yang diekspor dalam komponen Windows Runtime, pembatasan berikut berlaku:

  • Anda hanya dapat menentukan antarmuka IStringable dalam hubungan "class implements", seperti kode berikut di C#:

    public class NewClass : IStringable
    

    Atau kode Visual Basic berikut:

    Public Class NewClass : Implements IStringable
    
  • Anda tidak dapat mengimplementasikan IStringable pada antarmuka.

  • Anda tidak dapat mendeklarasikan parameter berjenis IStringable.

  • IStringable tidak boleh menjadi jenis pengembalian metode, properti, atau bidang.

  • Anda tidak dapat menyembunyikan implementasi IStringable Anda dari kelas dasar dengan menggunakan definisi metode seperti berikut:

    public class NewClass : IStringable
    {
       public new string ToString()
       {
          return "New ToString in NewClass";
       }
    }
    

    Sebaliknya, implementasi IStringable.ToString harus selalu mengambil alih implementasi kelas dasar. Anda dapat menyembunyikan implementasi ToString hanya dengan memanggilnya pada instans kelas yang sangat ditik.

Catatan

Dalam berbagai kondisi, panggilan dari kode asli ke jenis terkelola yang mengimplementasikan IStringable atau menyembunyikan implementasi ToString-nya dapat menghasilkan perilaku yang tidak terduga.

Operasi Asinkron

Untuk menerapkan metode asinkron dalam komponen Anda, tambahkan "Asinkron" ke akhir nama metode dan kembalikan salah satu antarmuka Windows Runtime yang mewakili tindakan atau operasi asinkron: IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult>, atau IAsyncOperationWithProgress<TResult, TProgress>.

Anda dapat menggunakan tugas .NET (kelas Tugas dan kelas Task<TResult> generik) untuk mengimplementasikan metode asinkron Anda. Anda harus mengembalikan tugas yang mewakili operasi yang sedang berlangsung, seperti tugas yang dikembalikan dari metode asinkron yang ditulis dalam C# atau Visual Basic, atau tugas yang dikembalikan dari metode Task.Run. Jika Anda menggunakan konstruktor untuk membuat tugas, Anda harus memanggil metode Task.Start sebelum mengembalikannya.

Metode yang menggunakan await (Await dalam Visual Basic) memerlukan async kata kunci (Async dalam Visual Basic). Jika Anda mengekspos metode seperti itu dari komponen Windows Runtime, terapkan async kata kunci ke delegasi yang Anda berikan ke metode Jalankan.

Untuk tindakan dan operasi asinkron yang tidak mendukung pembatalan atau pelaporan kemajuan, Anda dapat menggunakan metode ekstensi WindowsRuntimeSystemExtensions.AsAsyncAction atau AsAsyncOperation<TResult> untuk membungkus tugas di antarmuka yang sesuai. Misalnya, kode berikut mengimplementasikan metode asinkron dengan menggunakan metode Task.Run<TResult> untuk memulai tugas. Metode ekstensi TResult> AsAsyncOperation< mengembalikan tugas sebagai operasi asinkron Windows Runtime.

public static IAsyncOperation<IList<string>> DownloadAsStringsAsync(string id)
{
    return Task.Run<IList<string>>(async () =>
    {
        var data = await DownloadDataAsync(id);
        return ExtractStrings(data);
    }).AsAsyncOperation();
}
Public Shared Function DownloadAsStringsAsync(ByVal id As String) _
     As IAsyncOperation(Of IList(Of String))

    Return Task.Run(Of IList(Of String))(
        Async Function()
            Dim data = Await DownloadDataAsync(id)
            Return ExtractStrings(data)
        End Function).AsAsyncOperation()
End Function

Kode JavaScript berikut menunjukkan bagaimana metode dapat dipanggil dengan menggunakan objek WinJS.Promise . Fungsi yang diteruskan ke metode maka dijalankan ketika panggilan asinkron selesai. Parameter stringList berisi daftar string yang dikembalikan oleh metode DownloadAsStringAsync , dan fungsi melakukan pemrosesan apa pun yang diperlukan.

function asyncExample(id) {

    var result = SampleComponent.Example.downloadAsStringAsync(id).then(
        function (stringList) {
            // Place code that uses the returned list of strings here.
        });
}

Untuk tindakan dan operasi asinkron yang mendukung pembatalan atau pelaporan kemajuan, gunakan kelas AsyncInfo untuk menghasilkan tugas yang dimulai dan untuk menghubungkan fitur pembatalan dan pelaporan kemajuan tugas dengan fitur pembatalan dan pelaporan kemajuan dari antarmuka Windows Runtime yang sesuai. Untuk contoh yang mendukung pelaporan pembatalan dan kemajuan, lihat Panduan membuat komponen C# atau Visual Basic Windows Runtime, dan memanggilnya dari JavaScript.

Perhatikan bahwa Anda dapat menggunakan metode kelas AsyncInfo meskipun metode asinkron Anda tidak mendukung pembatalan atau pelaporan kemajuan. Jika Anda menggunakan fungsi lambda Visual Basic atau metode anonim C#, jangan berikan parameter untuk token dan antarmuka IProgress<T>. Jika Anda menggunakan fungsi C# lambda, berikan parameter token tetapi abaikan. Contoh sebelumnya, yang menggunakan metode AsAsyncOperation<TResult> , terlihat seperti ini saat Anda menggunakan metode AsyncInfo.Run<TResult>(Func<CancellationToken, Task<TResult>>) sebagai gantinya.

public static IAsyncOperation<IList<string>> DownloadAsStringsAsync(string id)
{
    return AsyncInfo.Run<IList<string>>(async (token) =>
    {
        var data = await DownloadDataAsync(id);
        return ExtractStrings(data);
    });
}
Public Shared Function DownloadAsStringsAsync(ByVal id As String) _
    As IAsyncOperation(Of IList(Of String))

    Return AsyncInfo.Run(Of IList(Of String))(
        Async Function()
            Dim data = Await DownloadDataAsync(id)
            Return ExtractStrings(data)
        End Function)
End Function

Jika Anda membuat metode asinkron yang secara opsional mendukung pembatalan atau pelaporan kemajuan, pertimbangkan untuk menambahkan kelebihan beban yang tidak memiliki parameter untuk token pembatalan atau antarmuka IProgress<T> .

Melemparkan pengecualian

Anda dapat melemparkan jenis pengecualian apa pun yang disertakan dalam .NET untuk aplikasi Windows. Anda tidak dapat mendeklarasikan jenis pengecualian publik Anda sendiri dalam komponen runtime Windows, tetapi Anda dapat mendeklarasikan dan melemparkan jenis non-publik.

Jika komponen Anda tidak menangani pengecualian, pengecualian yang sesuai akan dimunculkan dalam kode yang memanggil komponen Anda. Cara pengecualian muncul pada pemanggil tergantung pada cara bahasa pemanggil mendukung Windows Runtime.

  • Di JavaScript, pengecualian muncul sebagai objek di mana pesan pengecualian digantikan oleh pelacakan tumpukan. Saat men-debug aplikasi di Visual Studio, Anda dapat melihat teks pesan asli yang ditampilkan dalam kotak dialog pengecualian debugger, yang diidentifikasi sebagai "Informasi WinRT". Anda tidak dapat mengakses teks pesan asli dari kode JavaScript.

    Tip. Saat ini, pelacakan tumpukan berisi jenis pengecualian terkelola, tetapi kami tidak menyarankan penguraian jejak untuk mengidentifikasi jenis pengecualian. Sebagai gantinya, gunakan nilai HRESULT seperti yang dijelaskan nanti di bagian ini.

  • Di C++, pengecualian muncul sebagai pengecualian platform. Jika properti HResult pengecualian terkelola dapat dipetakan ke HRESULT dari pengecualian platform tertentu, pengecualian tertentu digunakan; jika tidak, pengecualian Platform::COMException dilemparkan. Teks pesan pengecualian terkelola tidak tersedia untuk kode C++. Jika pengecualian platform tertentu dilemparkan, teks pesan default untuk jenis pengecualian tersebut muncul; jika tidak, tidak ada teks pesan yang muncul. Lihat Pengecualian (C++/CX).

  • Dalam C# atau Visual Basic, pengecualiannya adalah pengecualian terkelola normal.

Saat Anda memberikan pengecualian dari komponen, Anda dapat mempermudah pemanggil JavaScript atau C++ untuk menangani pengecualian dengan melemparkan jenis pengecualian non-publik yang nilai properti HResult-nya khusus untuk komponen Anda. HRESULT tersedia untuk pemanggil JavaScript melalui properti nomor objek pengecualian, dan untuk penelepon C++ melalui properti COMException::HResult .

Catatan

Gunakan nilai negatif untuk HRESULT Anda. Nilai positif ditafsirkan sebagai keberhasilan, dan tidak ada pengecualian yang dilemparkan dalam pemanggil JavaScript atau C++.

Mendeklarasikan dan meningkatkan peristiwa

Saat Anda mendeklarasikan jenis untuk menyimpan data untuk peristiwa Anda, berasal dari Objek alih-alih dari EventArgs, karena EventArgs bukan jenis Runtime Windows. Gunakan EventHandler<TEventArgs> sebagai jenis peristiwa, dan gunakan jenis argumen peristiwa Anda sebagai argumen jenis generik. Tingkatkan peristiwa seperti yang Anda lakukan di aplikasi .NET.

Saat komponen Windows Runtime Anda digunakan dari JavaScript atau C++, peristiwa mengikuti pola peristiwa Windows Runtime yang diharapkan bahasa tersebut. Saat Anda menggunakan komponen dari C# atau Visual Basic, peristiwa muncul sebagai peristiwa .NET biasa. Contoh disediakan di Walkthrough untuk membuat komponen C# atau Visual Basic Windows Runtime, dan memanggilnya dari JavaScript.

Jika Anda menerapkan pengakses peristiwa kustom (mendeklarasikan peristiwa dengan kata kunci Kustom, di Visual Basic), Anda harus mengikuti pola peristiwa Windows Runtime dalam implementasi Anda. Lihat Peristiwa kustom dan pengaktif peristiwa di komponen Windows Runtime. Perhatikan bahwa ketika Anda menangani peristiwa dari kode C# atau Visual Basic, itu masih tampak sebagai peristiwa .NET biasa.

Langkah berikutnya

Setelah membuat komponen Windows Runtime untuk penggunaan Anda sendiri, Anda mungkin menemukan bahwa fungsi yang dienkapsulasinya berguna untuk pengembang lain. Anda memiliki dua opsi untuk mengemas komponen untuk didistribusikan ke pengembang lain. Lihat Mendistribusikan komponen runtime Windows terkelola.

Untuk informasi selengkapnya tentang fitur bahasa Visual Basic dan C#, dan dukungan .NET untuk Windows Runtime, lihat dokumentasi Visual Basic dan C#.

Pemecahan Masalah

Gejala Obat
Dalam aplikasi C++/WinRT, saat menggunakan komponen C# Windows Runtime yang menggunakan XAML, pengkompilasi menghasilkan kesalahan formulir "'MyNamespace_XamlTypeInfo': bukan anggota 'winrt::MyNamespace'"—di mana MyNamespace adalah nama namespace layanan komponen Windows Runtime. Di pch.h aplikasi C++/WinRT yang mengkonsumsi, tambahkan #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—mengganti MyNamespace sebagaimana mestinya.