Komponenten für Windows-Runtime in C# und Visual BasicWindows Runtime components with C# and Visual Basic

Sie können verwalteten Code verwenden, um eigene Windows-Runtime Typen zu erstellen und Sie in einer Windows-Runtime Komponente zu verpacken.You can use managed code to create your own Windows Runtime types and package them in a Windows Runtime component. Sie können Ihre Komponente in universelle Windows-Plattform-Apps (UWP) verwenden, die in C++, JavaScript, Visual Basic oder c# geschrieben sind.You can use your component in Universal Windows Platform (UWP) apps that are written in C++, JavaScript, Visual Basic, or C#. In diesem Thema werden die Regeln zum Erstellen einer Komponente und einige Aspekte der .NET-Unterstützung für die Windows-Runtime erläutert.This topic outlines the rules for creating a component, and discusses some aspects of .NET support for the Windows Runtime. Im Allgemeinen ist diese Unterstützung allen .NET-Programmierern klar.In general, that support is designed to be transparent to the .NET programmer. Wenn Sie aber eine Komponente erstellen, die mit JavaScript oder C++ verwendet werden soll, müssen Sie auf die Unterschiede bei der Unterstützung der Windows-Runtime durch diese Sprachen achten.However, when you create a component to use with JavaScript or C++, you need to be aware of differences in the way those languages support the Windows Runtime.

Wenn Sie eine Komponente nur für UWP-Apps erstellen, die in Visual Basic oder c# geschrieben sind, und die Komponente keine UWP-Steuerelemente enthält, empfiehlt es sich, die Klassen Bibliotheks Vorlage anstelle der Windows-Runtime Component -Projektvorlage in Microsoft Visual Studio zu verwenden.If you are creating a component for use only in UWP apps that are written in Visual Basic or C#, and the component does not contain UWP controls, then consider using the Class Library template instead of the Windows Runtime Component project template in Microsoft Visual Studio. Eine einfache Klassenbibliothek weist weniger Einschränkungen auf.There are fewer restrictions on a simple class library.

Deklarieren von Typen in Windows-Runtime KomponentenDeclaring types in Windows Runtime components

Intern können die Windows-Runtime Typen in der Komponente beliebige .NET-Funktionen verwenden, die in einer UWP-App zulässig sind.Internally, the Windows Runtime types in your component can use any .NET functionality that's allowed in a UWP app. Weitere Informationen finden Sie unter .net für UWP-apps.For more info, see .NET for UWP apps.

Extern können die Member ihrer Typen nur Windows-Runtime Typen für Ihre Parameter und Rückgabewerte verfügbar machen.Externally, the members of your types can expose only Windows Runtime types for their parameters and return values. In der folgenden Liste werden die Einschränkungen für .NET-Typen beschrieben, die von einer Windows-Runtime Komponente verfügbar gemacht werden.The following list describes the limitations on .NET types that are exposed from a Windows Runtime component.

  • Die Felder, Parameter und Rückgabewerte aller öffentlichen Typen und Member in der Komponente müssen Windows-Runtime-Typen sein.The fields, parameters, and return values of all the public types and members in your component must be Windows Runtime types. Diese Einschränkung schließt die Windows-Runtime Typen ein, die Sie erstellen, sowie die Typen, die von der Windows-Runtime selbst bereitgestellt werden.This restriction includes the Windows Runtime types that you author as well as types that are provided by the Windows Runtime itself. Es enthält auch eine Reihe von .NET-Typen.It also includes a number of .NET types. Die Aufnahme dieser Typen ist Teil der Unterstützung, die .net bereitstellt, um die natürliche Verwendung der Windows-Runtime in verwaltetem Code zu ermöglichen — . Ihr Code scheint vertraute .NET-Typen anstelle der zugrunde liegenden Windows-Runtime Typen zu verwenden.The inclusion of these types is part of the support that .NET provides to enable the natural use of the Windows Runtime in managed code—your code appears to use familiar .NET types instead of the underlying Windows Runtime types. Sie können z. b. die primitiven .NET-Typen, wie z. b. Int32 und Double, bestimmte grundlegende Typen, z. b. DateTimeOffset und URI, und einige häufig verwendete generische Schnittstellentypen wie **IEnumerable < T > ** (IEnumerable (of T) in Visual Basic) und **IDictionary < TKey, TValue > **verwenden.For example, you can use .NET primitive types such as Int32 and Double, certain fundamental types such as DateTimeOffset and Uri, and some commonly used generic interface types such as IEnumerable<T> (IEnumerable(Of T) in Visual Basic) and IDictionary<TKey,TValue>. Beachten Sie, dass die Typargumente dieser generischen Typen Windows-Runtime Typen sein müssen.Note that the type arguments of these generic types must be Windows Runtime types. Dies wird in den Abschnitten Weiterleiten von Windows-Runtime Typen an verwalteten Code und übergeben von verwalteten Typen an den Windows-Runtimeweiter unten in diesem Thema erläutert.This is discussed in the sections Passing Windows Runtime types to managed code and Passing managed types to the Windows Runtime, later in this topic.

  • Öffentliche Klassen und Schnittstellen können Methoden, Eigenschaften und Ereignisse enthalten.Public classes and interfaces can contain methods, properties, and events. Sie können Delegaten für Ihre Ereignisse deklarieren oder den **EventHandler < T > ** -Delegaten verwenden.You can declare delegates for your events, or use the EventHandler<T> delegate. Eine öffentliche Klasse oder Schnittstelle kann nicht folgende Aktionen ausführen:A public class or interface can't:

    • generisch sein.Be generic.
    • Implementieren Sie eine Schnittstelle, bei der es sich nicht um eine Windows-Runtime-Schnittstelle handelt (Sie können jedoch eigene Windows-Runtime Schnittstellen erstellen und implementieren).Implement an interface that is not a Windows Runtime interface (however, you can create your own Windows Runtime interfaces and implement them).
    • Leiten Sie von Typen ab, die sich nicht im Windows-Runtime befinden, wie z. b . System. Exception und System. EventArgs.Derive from types that are not in the Windows Runtime, such as System.Exception and System.EventArgs.
  • Alle öffentliche Typen müssen über einen Stammnamespace verfügen, der mit dem Assemblynamen übereinstimmt, und der Assemblyname darf nicht mit „Windows” beginnen.All public types must have a root namespace that matches the assembly name, and the assembly name must not begin with "Windows".

    Tipp:Tip. Standardmäßig entsprechen die Namespacenamen in Visual Studio-Projekten den Assemblynamen.By default, Visual Studio projects have namespace names that match the assembly name. In Visual Basic wird die Namespace-Anweisung für diesen Standardnamespace nicht im Code angezeigt.In Visual Basic, the Namespace statement for this default namespace is not shown in your code.

  • Öffentliche Strukturen können nur öffentliche Felder als Member enthalten, und diese Felder müssen Werttypen oder Zeichenfolgen sein.Public structures can't have any members other than public fields, and those fields must be value types or strings.

  • Öffentliche Klassen müssen versiegelt (NotInheritable in Visual Basic) sein.Public classes must be sealed (NotInheritable in Visual Basic). Wenn das Programmiermodell Polymorphie erfordert, können Sie eine öffentliche Schnittstelle erstellen und diese Schnittstelle in den Klassen implementieren, die polymorph sein müssen.If your programming model requires polymorphism, then you can create a public interface, and implement that interface on the classes that must be polymorphic.

Debuggen der KomponenteDebugging your component

Wenn sowohl Ihre UWP-App als auch die Komponente mit verwaltetem Code erstellt werden, können Sie beide gleichzeitig Debuggen.If both your UWP app and your component are built with managed code, then you can debug them both at the same time.

Wenn Sie die Komponente als Teil einer UWP-App mit C++ testen, können Sie verwalteten und nativen Code gleichzeitig Debuggen.When you're testing your component as part of a UWP app using C++, you can debug managed and native code at the same time. Die Vorgabe ist nur systemeigener Code.The default is native code only.

So debuggen Sie systemeigenen C++-Code und verwalteten CodeTo debug both native C++ code and managed code

  1. Öffnen Sie das Kontextmenü für das Visual C++-Projekt, und wählen Sie Eigenschaften aus.Open the shortcut menu for your Visual C++ project, and choose Properties.
  2. Wählen Sie auf den Eigenschaftenseiten unter Konfigurationseigenschaften die Option Debuggen aus.In the property pages, under Configuration Properties, choose Debugging.
  3. Wählen Sie Debuggertyp aus, und ändern Sie dann in der Dropdownliste Nur systemeigen in Gemischt (verwaltet und systemeigen).Choose Debugger Type, and in the drop-down list box change Native Only to Mixed (Managed and Native). Wählen Sie OK aus.Choose OK.
  4. Legen Sie Haltepunkte im systemeigenen und verwalteten Code fest.Set breakpoints in native and managed code.

Wenn Sie die Komponente als Teil einer UWP-App mit JavaScript testen, befindet sich die Projekt Mappe standardmäßig im JavaScript-Debugmodus.When you're testing your component as part of a UWP app using JavaScript, by default the solution is in JavaScript debugging mode. In Visual Studio ist das gleichzeitige Debuggen von JavaScript und verwaltetem Code nicht möglich.In Visual Studio, you can't debug JavaScript and managed code at the same time.

So debuggen Sie verwalteten Code anstelle von JavaScriptTo debug managed code instead of JavaScript

  1. Öffnen Sie das Kontextmenü für das JavaScript-Projekt, und wählen Sie Eigenschaften aus.Open the shortcut menu for your JavaScript project, and choose Properties.
  2. Wählen Sie auf den Eigenschaftenseiten unter Konfigurationseigenschaften die Option Debuggen aus.In the property pages, under Configuration Properties, choose Debugging.
  3. Wählen Sie Debuggertyp aus, und ändern Sie in der Dropdownliste Nur Skript in Nur verwaltet.Choose Debugger Type, and in the drop-down list box change Script Only to Managed Only. Wählen Sie OK aus.Choose OK.
  4. Legen Sie Haltepunkte im verwaltetem Code fest, und debuggen Sie wie gewohnt.Set breakpoints in managed code and debug as usual.

Übergeben von Windows-Runtime Typen an verwalteten CodePassing Windows Runtime types to managed code

Wie bereits im Abschnitt " Deklarieren von Typen in Windows-Runtime Komponenten" erwähnt, können bestimmte .NET-Typen in den Signaturen von Membern öffentlicher Klassen erscheinen.As mentioned previously in the section Declaring types in Windows Runtime components, certain .NET types can appear in the signatures of members of public classes. Dies ist Teil der Unterstützung, die .net bietet, um die natürliche Verwendung der Windows-Runtime in verwaltetem Code zu ermöglichen.This is part of the support that .NET provides to enable the natural use of the Windows Runtime in managed code. Darin sind primitive Typen und einige Klassen und Schnittstellen enthalten.It includes primitive types and some classes and interfaces. Wenn die Komponente von JavaScript oder von C++-Code verwendet wird, ist es wichtig zu wissen, wie die .NET-Typen dem Aufrufer angezeigt werden.When your component is used from JavaScript, or from C++ code, it's important to know how your .NET types appear to the caller. Beispiele mit JavaScript finden Sie unter Exemplarische Vorgehensweise : Erstellen einer c#-oder Visual Basic Windows-Runtime Komponente und Aufrufen dieser Komponente aus JavaScript .See Walkthrough of creating a C# or Visual Basic Windows Runtime component, and calling it from JavaScript for examples with JavaScript. In diesem Abschnitt werden häufig verwendete Typen beschrieben.This section discusses commonly used types.

In .net verfügen primitive Typen wie z. b. die Int32 -Struktur über viele nützliche Eigenschaften und Methoden, z. b. die tryparamese -Methode.In .NET, primitive types such as the Int32 structure have many useful properties and methods, such as the TryParse method. Im Gegensatz dazu haben primitive Typen und Strukturen in der Windows-Runtime nur Felder.By contrast, primitive types and structures in the Windows Runtime only have fields. Wenn Sie diese Typen an verwalteten Code übergeben, scheinen Sie .NET-Typen zu sein, und Sie können die Eigenschaften und Methoden von .NET-Typen wie gewohnt verwenden.When you pass these types to managed code, they appear to be .NET types, and you can use the properties and methods of .NET types as you normally would. Die folgende Liste fasst die Ersetzungen zusammen, die automatisch in der IDE vorgenommen werden:The following list summarizes the substitutions that are made automatically in the IDE:

  • Verwenden Sie für die Windows-Runtime primitive Int32, Int64, Single, Double, Boolean, String (eine unveränderliche Auflistung von Unicode-Zeichen), enum, UInt32, UInt64und GUIDden Typ desselben Namens im System-Namespace.For the Windows Runtime primitives Int32, Int64, Single, Double, Boolean, String (an immutable collection of Unicode characters), Enum, UInt32, UInt64, and Guid, use the type of the same name in the System namespace.
  • Verwenden Sie für UInt8den Wert System. Byte.For UInt8, use System.Byte.
  • Verwenden Char16Sie für Char16 System. Char.For Char16, use System.Char.
  • Verwenden Sie für die iinspectable -Schnittstelle die System. Object-Schnittstelle.For the IInspectable interface, use System.Object.

Wenn c# oder Visual Basic ein sprach Schlüsselwort für einen dieser Typen bereitstellt, können Sie stattdessen das Language-Schlüsselwort verwenden.If C# or Visual Basic provides a language keyword for any of these types, then you can use the language keyword instead.

Zusätzlich zu den primitiven Typen werden einige grundlegende, häufig verwendete Windows-Runtime Typen in verwaltetem Code als Ihre .NET-Entsprechungen angezeigt.In addition to primitive types, some basic, commonly used Windows Runtime types appear in managed code as their .NET equivalents. Angenommen, Ihr JavaScript-Code verwendet die Windows. Foundation. Uri -Klasse, und Sie möchten Sie an eine c#-oder Visual Basic-Methode übergeben.For example, suppose your JavaScript code uses the Windows.Foundation.Uri class, and you want to pass it to a C# or Visual Basic method. Der entsprechende Typ in verwaltetem Code ist die .NET-Klasse System. Uri , und das ist der Typ, der für den Methoden Parameter verwendet werden soll.The equivalent type in managed code is the .NET System.Uri class, and that's the type to use for the method parameter. Sie können erkennen, wenn ein Windows-Runtime Typ als .NET-Typ angezeigt wird, da IntelliSense in Visual Studio beim Schreiben von verwaltetem Code den Windows-Runtime-Typ verbirgt und den entsprechenden .NET-Typ anzeigt.You can tell when a Windows Runtime type appears as a .NET type, because IntelliSense in Visual Studio hides the Windows Runtime type when you're writing managed code, and presents the equivalent .NET type. (In der Regel haben beiden Typen den gleichen Namen.(Usually the two types have the same name. Beachten Sie jedoch, dass die Windows. Foundation. DateTime -Struktur in verwaltetem Code als System. DateTimeOffset und nicht als System. DateTimeangezeigt wird.However, note that the Windows.Foundation.DateTime structure appears in managed code as System.DateTimeOffset and not as System.DateTime.)

Bei einigen häufig verwendeten Auflistungs Typen erfolgt die Zuordnung zwischen den Schnittstellen, die von einem Windows-Runtime-Typ implementiert werden, und den Schnittstellen, die vom entsprechenden .NET-Typ implementiert werden.For some commonly used collection types, the mapping is between the interfaces that are implemented by a Windows Runtime type and the interfaces that are implemented by the corresponding .NET type. Wie bei den oben erwähnten Typen deklarieren Sie Parametertypen mithilfe des .net-Typs.As with the types mentioned above, you declare parameter types by using the .NET type. Dies verbirgt einige Unterschiede zwischen den Typen und macht das Schreiben von .NET-Code natürlicher.This hides some differences between the types and makes writing .NET code more natural.

In der folgenden Tabelle sind die häufigsten dieser generischen Schnittstellentypen zusammen mit anderen allgemeinen Klassen- und Schnittstellenzuordnungen aufgeführt.The following table lists the most common of these generic interface types, along with other common class and interface mappings. Eine umfassende Liste der Windows-Runtime Typen, die von .net Maps zugeordnet werden, finden Sie unter .net-Zuordnungen von Windows-Runtime Typen.For a complete list of Windows Runtime types that .NET maps, see .NET mappings of Windows Runtime types.

Windows-RuntimeWindows Runtime .NET.NET
IIterable<T>IIterable<T> IEnumerable < T>IEnumerable<T>
IVector<T>IVector<T> IList < T>IList<T>
IVectorView<T>IVectorView<T> Ilesonlylist < T>IReadOnlyList<T>
IMap < K, V>IMap<K, V> IDictionary < TKey, TValue>IDictionary<TKey, TValue>
IMapView<K, V>IMapView<K, V> Ileseronlydictionary < TKey, TValue>IReadOnlyDictionary<TKey, TValue>
Ikeyvaluepair < K, V>IKeyValuePair<K, V> KeyValuePair < TKey, TValue>KeyValuePair<TKey, TValue>
IBindableIterableIBindableIterable IEnumerableIEnumerable
IBindableVecinrIBindableVector IListIList
Windows.UI.Xaml.Data.INotifyPropertyChangedWindows.UI.Xaml.Data.INotifyPropertyChanged System.ComponentModel.INotifyPropertyChangedSystem.ComponentModel.INotifyPropertyChanged
Windows.UI.Xaml.Data.PropertyChangedEventHandlerWindows.UI.Xaml.Data.PropertyChangedEventHandler System.ComponentModel.PropertyChangedEventHandlerSystem.ComponentModel.PropertyChangedEventHandler
Windows.UI.Xaml.Data.PropertyChangedEventArgsWindows.UI.Xaml.Data.PropertyChangedEventArgs System.ComponentModel.PropertyChangedEventArgsSystem.ComponentModel.PropertyChangedEventArgs

Wenn ein Typ mehrere Schnittstellen implementiert, können Sie jede Schnittstelle verwenden, die als Parametertyp oder Rückgabetyp eines Members implementiert wird.When a type implements more than one interface, you can use any of the interfaces it implements as a parameter type or return type of a member. Beispielsweise können Sie das Wörterbuch < int > , String (Dictionary (of Integer, String) in Visual Basic) als **IDictionary < int, String > **, **ilesonlydictionary < int, String > **oder **IEnumerable < System. Collections. Generic. KeyValuePair < TKey, TValue > > **übergeben oder zurückgeben.For example, you can pass or return a Dictionary<int, string> (Dictionary(Of Integer, String) in Visual Basic) as IDictionary<int, string>, IReadOnlyDictionary<int, string>, or IEnumerable<System.Collections.Generic.KeyValuePair<TKey, TValue>>.

Wichtig

JavaScript verwendet die Schnittstelle, die zuerst in der Liste der Schnittstellen angezeigt wird, die ein verwalteter Typ implementiert.JavaScript uses the interface that appears first in the list of interfaces that a managed type implements. Wenn Sie z. b. " Dictionary < int" > , "String " in JavaScript-Code zurückgeben, wird es als " **IDictionary int", "String" ( < Zeichenfolge > ** ) angezeigtFor example, if you return Dictionary<int, string> to JavaScript code, it appears as IDictionary<int, string> no matter which interface you specify as the return type. Das bedeutet, dass die erste Schnittstelle Member enthalten muss, die in den nächsten Schnittstellen erscheinen, damit diese Member für JavaScript sichtbar sind.This means that if the first interface doesn't include a member that appears on later interfaces, that member isn't visible to JavaScript.

In der Windows-Runtime werden **IMap < k, v > ** und **imapview < K V > ** mithilfe von "ikeyvaluepair" durchlaufen.In the Windows Runtime, IMap<K, V> and IMapView<K, V> are iterated by using IKeyValuePair. Wenn Sie Sie an verwalteten Code übergeben, werden Sie als **IDictionary < TKey, TValue > ** und **ileseronlydictionary < TKey, TValue > **angezeigt. Daher verwenden Sie **System. Collections. Generic. KeyValuePair < TKey, TValue > ** , um Sie aufzulisten.When you pass them to managed code, they appear as IDictionary<TKey, TValue> and IReadOnlyDictionary<TKey, TValue>, so naturally you use System.Collections.Generic.KeyValuePair<TKey, TValue> to enumerate them.

Die Darstellungsweise von Schnittstellen in verwaltetem Code wirkt sich auf die Darstellungsweise der Typen aus, die diese Schnittstellen implementieren.The way interfaces appear in managed code affects the way types that implement these interfaces appear. Beispielsweise implementiert die PropertySet -Klasse **IMap < K, V > **, das in verwaltetem Code als **IDictionary < TKey, TValue > **angezeigt wird.For example, the PropertySet class implements IMap<K, V>, which appears in managed code as IDictionary<TKey, TValue>. PropertySet wird so angezeigt, als ob es IDictionary < TKey, > TValue anstelle von IMap < K > , Vimplementiert hat, sodass es in verwaltetem Code über eine Add -Methode verfügt, die sich wie die Add -Methode in .net-Wörterbüchern verhält.PropertySet appears as if it implemented IDictionary<TKey, TValue> instead of IMap<K, V>, so in managed code it appears to have an Add method, which behaves like the Add method on .NET dictionaries. Es scheint keine Insert -Methode zu haben.It doesn't appear to have an Insert method. Dieses Beispiel finden Sie im Thema Exemplarische Vorgehensweise zum Erstellen einer c#-oder Visual Basic Windows-Runtime Komponente und zum Aufrufen dieser Komponente über JavaScript.You can see this example in the topic Walkthrough of creating a C# or Visual Basic Windows Runtime component, and calling it from JavaScript.

Übergeben von verwalteten Typen an die Windows-RuntimePassing managed types to the Windows Runtime

Wie bereits im vorherigen Abschnitt erläutert, können einige Windows-Runtime Typen als .NET-Typen in den Signaturen der Member der Komponente oder in den Signaturen Windows-Runtime Members angezeigt werden, wenn Sie Sie in der IDE verwenden.As discussed in the previous section, some Windows Runtime types can appear as .NET types in the signatures of your component's members, or in the signatures of Windows Runtime members when you use them in the IDE. Wenn Sie .NET-Typen an diese Member übergeben oder als Rückgabewerte der Member der Komponente verwenden, werden Sie im Code auf der anderen Seite als der entsprechende Windows-Runtime Typs angezeigt.When you pass .NET types to these members or use them as the return values of your component's members, they appear to the code on the other side as the corresponding Windows Runtime type. Beispiele für die Auswirkungen, die dies haben kann, wenn Ihre Komponente aus JavaScript aufgerufen wird, finden Sie im Abschnitt "zurückgeben von verwalteten Typen aus der Komponente" unter Exemplarische Vorgehensweise zum Erstellen einer c#-oder Visual Basic Windows-Runtime Komponente und zum Aufrufen dieserKomponente über JavaScript.For examples of the effects this can have when your component is called from JavaScript, see the "Returning managed types from your component" section in Walkthrough of creating a C# or Visual Basic Windows Runtime component, and calling it from JavaScript.

Überladene MethodenOverloaded methods

In der Windows-Runtime können Methoden überladen werden.In the Windows Runtime, methods can be overloaded. Wenn Sie jedoch mehrere über Ladungen mit der gleichen Anzahl von Parametern deklarieren, müssen Sie das Windows. Foundation. Metadata. defaultoverloadattribute -Attribut auf nur eine dieser über Ladungen anwenden.However, if you declare multiple overloads with the same number of parameters, you must apply the Windows.Foundation.Metadata.DefaultOverloadAttribute attribute to only one of those overloads. Nur diese Überladung kann aus JavaScript aufgerufen werden.That overload is the only one you can call from JavaScript. Im folgenden Code ist beispielsweise die Überladung, die int übernimmt (Integer in Visual Basic), die Standardüberladung.For example, in the following code the overload that takes an int (Integer in Visual Basic) is the default overload.

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

Wichtig JavaScript ermöglicht das Übergeben eines beliebigen Werts an OverloadExampleund wandelt den Wert in den Typ um, der für den-Parameter erforderlich ist.[IMPORTANT] JavaScript allows you to pass any value to OverloadExample, and coerces the value to the type that is required by the parameter. Sie können OverloadExample mit "42", "42" oder 42,3 aufrufen, aber alle diese Werte werden an die Standard Überladung geleitet.You can call OverloadExample with "forty-two", "42", or 42.3, but all those values are passed to the default overload. Die Standard Überladung im vorherigen Beispiel gibt 0, 42 bzw. 42 zurück.The default overload in the previous example returns 0, 42, and 42, respectively.

Das Attribut defauldeverloadattribuekann nicht auf Konstruktoren angewendet werden.You can't apply the DefaultOverloadAttribute attribute to constructors. Alle Konstruktoren in einer Klasse müssen eine unterschiedliche Anzahl von Parametern aufweisen.All the constructors in a class must have different numbers of parameters.

Implementieren von IStringableImplementing IStringable

Beginnend mit Windows 8.1 enthält die Windows-Runtime eine istringable -Schnittstelle, deren einzige Methode, istringable. destring, eine grundlegende Formatierungs Unterstützung bietet, die vergleichbar mit der von Object. destringbereitgestellten ist.Starting with Windows 8.1, the Windows Runtime includes an IStringable interface whose single method, IStringable.ToString, provides basic formatting support comparable to that provided by Object.ToString. Wenn Sie istringable in einem öffentlich verwalteten Typ implementieren möchten, der in eine Windows-Runtime Komponente exportiert wird, gelten die folgenden Einschränkungen:If you do choose to implement IStringable in a public managed type that is exported in a Windows Runtime component, the following restrictions apply:

  • Sie können die istringable -Schnittstelle nur in einer "Klasse implementiert"-Beziehung definieren, wie z. b. dem folgenden Code in c#:You can define the IStringable interface only in a "class implements" relationship, such as the following code in C#:

    public class NewClass : IStringable
    

    Oder in Visual Basic-Code:Or the following Visual Basic code:

    Public Class NewClass : Implements IStringable
    
  • Sie können istringable nicht in einer Schnittstelle implementieren.You can't implement IStringable on an interface.

  • Sie können einen Parameter nicht als Typ istringabledeklarieren.You can't declare a parameter to be of type IStringable.

  • Istringable kann nicht der Rückgabetyp einer Methode, einer Eigenschaft oder eines Felds sein.IStringable can't be the return type of a method, property, or field.

  • Sie können die istringable -Implementierung nicht aus Basisklassen ausblenden, indem Sie eine Methoden Definition wie die folgende verwenden:You can't hide your IStringable implementation from base classes by using a method definition such as the following:

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

    Stattdessen muss die Implementierung istringable. destring die Basisklassen Implementierung immer überschreiben.Instead, the IStringable.ToString implementation must always override the base class implementation. Sie können eine Implementierung von " destring " nur ausblenden, indem Sie Sie auf einer stark typisierten Klasseninstanz aufrufen.You can hide a ToString implementation only by invoking it on a strongly typed class instance.

Hinweis

Unter einer Vielzahl von Bedingungen kann es bei Aufrufen von System eigenem Code zu einem verwalteten Typ, der istringable implementiert oder seine destring -Implementierung verbirgt, zu unerwartetem Verhalten führen.Under a variety of conditions, calls from native code to a managed type that implements IStringable or hides its ToString implementation can produce unexpected behavior.

Asynchrone VorgängeAsynchronous operations

Um eine asynchrone Methode in der Komponente zu implementieren, fügen Sie "Async" am Ende des Methoden namens hinzu und geben eine der Windows-Runtime-Schnittstellen zurück, die asynchrone Aktionen oder Vorgänge darstellen: iasyncaction, **iasyncactionwithprogress < tprogress > **, **iasyncoperation < TResult > **oder iasyncoperationwithprogress < TResult > , tprogress.To implement an asynchronous method in your component, add "Async" to the end of the method name and return one of the Windows Runtime interfaces that represent asynchronous actions or operations: IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult>, or IAsyncOperationWithProgress<TResult, TProgress>.

Sie können .net-Aufgaben (die Aufgaben Klasse und die generische **Aufgabe < TResult > ** -Klasse) verwenden, um die asynchrone Methode zu implementieren.You can use .NET tasks (the Task class and generic Task<TResult> class) to implement your asynchronous method. Sie müssen eine Aufgabe zurückgeben, die einen laufenden Vorgang darstellt, z. b. einen Task, der von einer asynchronen Methode zurückgegeben wird, die in c# oder Visual Basic geschrieben wurde, oder eine Aufgabe, die von der Task. Run -Methode zurückgegeben wird.You must return a task that represents an ongoing operation, such as a task that is returned from an asynchronous method written in C# or Visual Basic, or a task that is returned from the Task.Run method. Wenn Sie für die Aufgabenerstellung einen Konstruktor verwenden, müssen Sie seine Task.Start-Methode vor der Rückgabe aufrufen.If you use a constructor to create the task, you must call its Task.Start method before returning it.

Eine Methode, die await ( Await in Visual Basic) verwendet, erfordert das async Schlüsselwort ( Async in Visual Basic).A method that uses await (Await in Visual Basic) requires the async keyword (Async in Visual Basic). Wenn Sie eine solche Methode aus einer Windows-Runtime Komponente verfügbar machen, wenden Sie das- async Schlüsselwort auf den Delegaten an, den Sie an die Run -Methode übergeben.If you expose such a method from a Windows Runtime component, apply the async keyword to the delegate that you pass to the Run method.

Für asynchrone Aktionen und Vorgänge, die weder die Abbruch- noch die Fortschrittsberichterstattung unterstützen, können Sie mit der Erweiterungsmethode WindowsRuntimeSystemExtensions.AsAsyncAction oder AsAsyncOperation<TResult> die Aufgabe in die entsprechende Schnittstelle umschließen.For asynchronous actions and operations that do not support cancellation or progress reporting, you can use the WindowsRuntimeSystemExtensions.AsAsyncAction or AsAsyncOperation<TResult> extension method to wrap the task in the appropriate interface. Beispielsweise implementiert der folgende Code eine asynchrone Methode, indem die **Task. Run < TResult > ** -Methode verwendet wird, um eine Aufgabe zu starten.For example, the following code implements an asynchronous method by using the Task.Run<TResult> method to start a task. Die " **asasyncoperation < TResult > ** "-Erweiterungsmethode gibt die Aufgabe als Windows-Runtime asynchronen Vorgang zurück.The AsAsyncOperation<TResult> extension method returns the task as a Windows Runtime asynchronous operation.

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

Der folgende JavaScript-Code zeigt, wie die-Methode mit einem winjs. Promise -Objekt aufgerufen werden kann.The following JavaScript code shows how the method could be called by using a WinJS.Promise object. Die an die then-Methode übergebene Funktion wird ausgeführt, wenn der asynchrone Aufruf abgeschlossen ist.The function that is passed to the then method is executed when the asynchronous call completes. Der stringlist-Parameter enthält die Liste der Zeichen folgen, die von der downloadasstringasync -Methode zurückgegeben werden, und die Funktion übernimmt die erforderliche Verarbeitung.The stringList parameter contains the list of strings that is returned by the DownloadAsStringAsync method, and the function does whatever processing is required.

function asyncExample(id) {

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

Verwenden Sie für asynchrone Aktionen und Vorgänge, die die Abbruch-oder Fortschritts Berichterstattung unterstützen, die asyncinfo -Klasse, um eine gestartete Aufgabe zu generieren und die Abbruch-und Fortschritts Berichterstattungs Funktionen der Aufgabe mit den Abbruch-und Fortschritts Berichterstattungs Funktionen der entsprechenden Windows-Runtime-Schnittstelle zu verbinden.For asynchronous actions and operations that support cancellation or progress reporting, use the AsyncInfo class to generate a started task and to hook up the cancellation and progress reporting features of the task with the cancellation and progress reporting features of the appropriate Windows Runtime interface. Ein Beispiel, das sowohl die Abbruch-als auch die Fortschritts Berichterstattung unterstützt, finden Sie unter Exemplarische Vorgehensweise: Erstellen einer c#-oder Visual Basic Windows-Runtime Komponente und Aufrufen dieser Komponente über JavaScript.For an example that supports both cancellation and progress reporting, see Walkthrough of creating a C# or Visual Basic Windows Runtime component, and calling it from JavaScript.

Beachten Sie, dass Sie die Methoden der asyncinfo -Klasse auch dann verwenden können, wenn Ihre asynchrone Methode die Abbruch-oder Fortschritts Berichterstattung nicht unterstützt.Note that you can use the methods of the AsyncInfo class even if your asynchronous method doesn't support cancellation or progress reporting. Wenn Sie eine Visual Basic Lambda-Funktion oder eine anonyme c#-Methode verwenden, geben Sie keine Parameter für das Token und die **iprogress < t > ** -Schnittstelle an.If you use a Visual Basic lambda function or a C# anonymous method, don't supply parameters for the token and IProgress<T> interface. Wenn Sie eine C#-Lambda-Funktion verwenden, geben Sie einen Tokenparameter an, aber ignorieren Sie ihn.If you use a C# lambda function, supply a token parameter but ignore it. Das vorherige Beispiel, das die Methode asasyncoperation < TResult verwendet > , sieht wie folgt aus, wenn Sie stattdessen die Methode asyncinfo. Run < TResult > (Func < CancellationToken, Task < > > TResult) verwenden.The previous example, which used the AsAsyncOperation<TResult> method, looks like this when you use the AsyncInfo.Run<TResult>(Func<CancellationToken, Task<TResult>>) method overload instead.

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

Wenn Sie eine asynchrone Methode erstellen, die optional die Abbruch-oder Fortschritts Berichterstattung unterstützt, sollten Sie über Ladungen hinzufügen, die keine Parameter für ein Abbruch Token oder die **iprogress < t > ** -Schnittstelle aufweisen.If you create an asynchronous method that optionally supports cancellation or progress reporting, consider adding overloads that don't have parameters for a cancellation token or the IProgress<T> interface.

Auslösen von AusnahmenThrowing exceptions

Sie können jeden Ausnahmetyp auslösen, der in .NET für Windows-Apps enthalten ist.You can throw any exception type that is included in the .NET for Windows apps. Sie können keine eigenen öffentlichen Ausnahmetypen in einer Komponente für Windows-Runtime deklarieren, aber Sie können nicht öffentliche Typen deklarieren und auslösen.You can't declare your own public exception types in a Windows Runtime component, but you can declare and throw non-public types.

Wenn die Komponente die Ausnahme nicht behandelt, wird eine entsprechende Ausnahme im Code ausgelöst, der die Komponente aufgerufen hat.If your component doesn't handle the exception, a corresponding exception is raised in the code that called your component. Die Unterstützung der Windows-Runtime durch die aufrufende Sprache bestimmt, wie die Ausnahme dem Aufrufer dargestellt wird.The way the exception appears to the caller depends on the way the calling language supports the Windows Runtime.

  • In JavaScript erscheint die Ausnahme als Objekt, in dem die Ausnahmemeldung durch eine Stapelüberwachung ersetzt ist.In JavaScript, the exception appears as an object in which the exception message is replaced by a stack trace. Wenn Sie Ihre App in Visual Studio debuggen, wird der Originaltext der Meldung im Ausnahmedialogfeld des Debuggers unter „WinRT Information" angezeigt.When you debug your app in Visual Studio, you can see the original message text displayed in the debugger exception dialog box, identified as "WinRT Information". Sie können mit JavaScript-Code nicht auf den Originaltext der Meldung zugreifen.You can't access the original message text from JavaScript code.

    Tipp:Tip.Momentan enthält die Stapelüberwachung den verwalteten Ausnahmetyp, aber es ist nicht empfehlenswert, diese zu untersuchen, um den Ausnahmetyp zu identifizieren. Currently, the stack trace contains the managed exception type, but we don't recommend parsing the trace to identify the exception type. Verwenden Sie stattdessen einen HRESULT-Wert, wie weiter unten in diesem Abschnitt beschrieben.Instead, use an HRESULT value as described later in this section.

  • In C++ erscheint die Ausnahme als Plattformausnahme.In C++, the exception appears as a platform exception. Wenn die HRESULT-Eigenschaft der verwalteten Ausnahme dem HRESULT einer bestimmten Platt Form Ausnahme zugeordnet werden kann, wird die spezifische Ausnahme verwendet. Andernfalls wird eine Platform:: COMException -Ausnahme ausgelöst.If the managed exception's HResult property can be mapped to the HRESULT of a specific platform exception, the specific exception is used; otherwise, a Platform::COMException exception is thrown. Der Meldungstext der verwalteten Ausnahme ist für C++-Code nicht verfügbar.The message text of the managed exception is not available to C++ code. Wenn eine bestimmte Plattformausnahme ausgelöst wurde, erscheint der Meldungstext für diesen Ausnahmetyp. Andernfalls wird kein Meldungstext ausgegeben.If a specific platform exception was thrown, the default message text for that exception type appears; otherwise, no message text appears. Siehe Ausnahmen (C++/CX).See Exceptions (C++/CX).

  • In C# oder Visual Basic ist die Ausnahme eine normale verwaltete Ausnahme.In C# or Visual Basic, the exception is a normal managed exception.

Wenn Sie in Ihrer Komponente eine Ausnahme auslösen, sollten Sie einen nicht öffentlichen Ausnahmetyp verwenden, dessen HResult-Eigenschaftswert speziell für Ihre Komponente gilt, damit die Ausnahme leichter von einem JavaScript- oder C++-Aufrufer verwaltet werden kann.When you throw an exception from your component, you can make it easier for a JavaScript or C++ caller to handle the exception by throwing a non-public exception type whose HResult property value is specific to your component. Das HRESULT ist für einen JavaScript-Aufrufer über die Number-Eigenschaft des Ausnahme Objekts verfügbar, und für einen C++-Aufrufer über die COMException:: HRESULT -Eigenschaft.The HRESULT is available to a JavaScript caller through the exception object's number property, and to a C++ caller through the COMException::HResult property.

Hinweis

Verwenden Sie einen negativen Wert für HRESULT.Use a negative value for your HRESULT. Ein positiver Wert wird als Erfolg interpretiert und im JavaScript- oder C++-Aufrufer wird keine Ausnahme ausgelöst.A positive value is interpreted as success, and no exception is thrown in the JavaScript or C++ caller.

Deklarieren und Auslösen von EreignissenDeclaring and raising events

Wenn Sie einen Typ deklarieren, um die Daten für das Ereignis aufzunehmen, leiten Sie diesen von „Object“ und nicht von „EventArgs“ ab, da „EventArgs“ kein Windows-Runtime-Typ ist.When you declare a type to hold the data for your event, derive from Object instead of from EventArgs, because EventArgs is not a Windows Runtime type. Verwenden Sie **EventHandler < TEventArgs > ** als Typ des Ereignisses, und verwenden Sie den Ereignis Argumenttyp als generisches Typargument.Use EventHandler<TEventArgs> as the type of the event, and use your event argument type as the generic type argument. Rufen Sie das-Ereignis genau wie in einer .NET-Anwendung auf.Raise the event just as you would in a .NET application.

Wenn Ihre Komponente für Windows-Runtime von JavaScript oder C++ verwendet wird, folgt das Ereignis dem Windows-Runtime-Ereignismuster, das diese Sprachen erwarten.When your Windows Runtime component is used from JavaScript or C++, the event follows the Windows Runtime event pattern that those languages expect. Wenn Sie die Komponente aus c# oder Visual Basic verwenden, wird das Ereignis als normales .NET-Ereignis angezeigt.When you use the component from C# or Visual Basic, the event appears as an ordinary .NET event. Ein Beispiel finden Sie unter Exemplarische Vorgehensweise : Erstellen einer c#-oder Visual Basic Windows-Runtime Komponente und Aufrufen dieser Komponente über JavaScript.An example is provided in Walkthrough of creating a C# or Visual Basic Windows Runtime component, and calling it from JavaScript.

Wenn Sie benutzerdefinierte Ereignisaccessoren implementieren (in Visual Basic ein Ereignis mit dem Schlüsselwort Custom deklarieren), müssen Sie in der Implementierung das Windows-Runtime-Ereignismuster verwenden.If you implement custom event accessors (declare an event with the Custom keyword, in Visual Basic), you must follow the Windows Runtime event pattern in your implementation. Siehe benutzerdefinierte Ereignisse und Ereignisaccessoren in Windows-Runtime-Komponenten.See Custom events and event accessors in Windows Runtime components. Beachten Sie, dass bei der Behandlung des-Ereignisses aus c# oder Visual Basic-Code ein normales .NET-Ereignis angezeigt wird.Note that when you handle the event from C# or Visual Basic code, it still appears to be an ordinary .NET event.

Nächste SchritteNext steps

Nachdem Sie eine Komponente für Windows-Runtime für eigene Zwecke erstellt haben, stellen Sie möglicherweise fest, dass die Funktionen, die diese kapselt, für andere Entwickler nützlich sind.After you’ve created a Windows Runtime component for your own use, you may find that the functionality it encapsulates is useful to other developers. Sie haben zwei Optionen, um eine Komponente für die Verteilung an andere Entwickler zu packen.You have two options for packaging a component for distribution to other developers. Siehe Verteilen einer verwalteten Komponente für Windows-Runtime.See Distributing a managed Windows Runtime component.

Weitere Informationen zu Visual Basic-und c#-sprach Features sowie zu .NET-Unterstützung für die Windows-Runtime finden Sie unter Visual Basic-und c#-Sprachreferenz.For more information about Visual Basic and C# language features, and .NET support for the Windows Runtime, see Visual Basic and C# language reference.

ProblembehandlungTroubleshooting

SymptomSymptom ProblembehandlungRemedy
Wenn Sie in einer C++/WinRT-App eine c#-Windows-Runtime Komponente verwenden, die XAML verwendet, erzeugt der Compiler einen Fehler in der Form "" MyNamespace_XamlTypeInfo ": ist kein Member von" WinRT:: mynamespace ", — wobei" MyNamespace "der Name des Namespace der Windows-Runtime Komponente ist.In a C++/WinRT app, when consuming a C# Windows Runtime component that uses XAML, the compiler produces an error of the form "'MyNamespace_XamlTypeInfo': is not a member of 'winrt::MyNamespace'"—where MyNamespace is the name of the Windows Runtime component's namespace. pch.hFügen Sie in in der C++-App/WinRT-APP das #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> — Ersetzen von MyNamespace nach Bedarf hinzu.In pch.h in the consuming C++/WinRT app, add #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—replacing MyNamespace as appropriate.