Komponen Windows Runtime dengan C# dan Visual Basic

Anda dapat menggunakan kode terkelola untuk membuat jenis Windows Runtime Anda sendiri dan mengemasnya dalam komponen Windows Runtime. Anda dapat menggunakan komponen di aplikasi Platform Windows Universal (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 itu dirancang agar transparan bagi 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 komponen Windows Runtime dengan C#/WinRT.

Mendeklarasikan jenis dalam komponen Windows Runtime

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 Windows Runtime untuk parameter mereka dan mengembalikan nilai. 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 jenis Windows 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 Windows Runtime dalam kode terkelola—kode Anda tampaknya menggunakan jenis .NET yang sudah dikenal alih-alih jenis Windows Runtime 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 jenis Windows Runtime. Ini dibahas di bagian Meneruskan jenis Windows Runtime 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 di 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 dibangun 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. Di 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 drop-down ubah Skrip Saja menjadi Hanya Terkelola. Pilih OK.
  4. Atur titik henti dalam kode terkelola dan debug seperti biasa.

Meneruskan jenis Windows Runtime ke kode terkelola

Seperti disebutkan sebelumnya di bagian Mendeklarasikan jenis di komponen Windows Runtime, jenis .NET tertentu dapat muncul di tanda tangan anggota kelas publik. Ini adalah bagian dari dukungan yang disediakan .NET untuk mengaktifkan 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 merangkum substitusi yang dibuat secara otomatis dalam IDE:

  • Untuk primitif Windows Runtime 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 Windows Runtime dasar yang umum digunakan muncul dalam kode terkelola sebagai setara .NET mereka. Misalnya, kode JavaScript Anda menggunakan kelas Windows.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 Windows Runtime muncul sebagai jenis .NET, karena IntelliSense di Visual Studio menyembunyikan jenis Windows Runtime saat Anda menulis kode terkelola, dan menyajikan jenis .NET yang setara. (Biasanya kedua jenis tersebut memiliki nama yang sama. Namun, perhatikan bahwa struktur Windows.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 Windows Runtime 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 kelas umum dan pemetaan antarmuka lainnya. Untuk daftar lengkap jenis Windows Runtime yang dipetakan .NET, lihat pemetaan .NET jenis Windows Runtime.

Windows Runtime .NET
IIterable<T> IEnumerable<T>
IVector<T> IList<T>
IVectorView<T> IReadOnlyList<T>
IMap<K, V> TKey IDictionary<, 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) di 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 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.

Di Windows Runtime, IMap<K, V> danIMapView<K, V> di-iterasi dengan menggunakan IKeyValuePair. Ketika Anda meneruskannya ke kode terkelola, mereka 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 membuat 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 di 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 Windows Runtime yang sesuai. Untuk contoh efek yang dapat dimiliki 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

Di Windows Runtime, metode dapat kelebihan beban. Namun, jika Anda mendeklarasikan beberapa kelebihan beban dengan jumlah parameter yang sama, Anda harus menerapkan atribut Windows.Foundation.Metadata.DefaultOverloadAttribute hanya ke 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 di 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 yang 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 dapat menentukan antarmuka IStringable hanya 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 ditik dengan kuat.

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 di 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 di 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 AsAsyncOperation<TResult> 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 then 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 ketika 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 aplikasi .NET untuk Windows. Anda tidak dapat mendeklarasikan jenis pengecualian publik Anda sendiri dalam komponen Windows Runtime, 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 jejak 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 khusus 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).

  • Di 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 sukses, 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 Windows Runtime. Gunakan EventHandler<TEventArgs> sebagai jenis peristiwa, dan gunakan jenis argumen peristiwa Anda sebagai argumen jenis generik. Naikkan acara 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 dalam Panduan 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 tampaknya menjadi peristiwa .NET biasa.

Langkah berikutnya

Setelah Anda membuat komponen Windows Runtime untuk penggunaan Anda sendiri, Anda mungkin menemukan bahwa fungsionalitas yang dienkapsulasinya berguna untuk pengembang lain. Anda memiliki dua opsi untuk mengemas komponen untuk distribusi ke pengembang lain. Lihat Mendistribusikan komponen Windows Runtime 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 komponen Windows Runtime. Di pch.h aplikasi C++/WinRT yang mengkonsumsi, tambahkan #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—mengganti MyNamespace sebagaimana mestinya.