C# および Visual Basic での Windows ランタイム コンポーネントの作成Creating Windows Runtime Components in C# and Visual Basic

以降、.NET Framework 4.5 では、マネージ コードを使用して、独自の Windows ランタイム型を作成し、Windows ランタイム コンポーネントにパッケージ化します。Starting with the .NET Framework 4.5, you can use managed code to create your own Windows Runtime types and package them in a Windows Runtime component. C++、JavaScript、Visual Basic で記述されているユニバーサル Windows プラットフォーム (UWP) アプリで、コンポーネントを使用するか、C#します。You can use your component in Universal Windows Platform (UWP) apps that are written in C++, JavaScript, Visual Basic, or C#. このトピックでは、コンポーネントを作成するための規則を示し、Windows ランタイム向けの .NET Framework のサポートをいくつか説明します。This topic outlines the rules for creating a component, and discusses some aspects of .NET Framework support for the Windows Runtime. このサポートは、通常、.NET Framework のプログラマが意識しなくても利用できるように設計されています。In general, that support is designed to be transparent to the .NET Framework programmer. ただし、JavaScript や C++ で使うコンポーネントを作成する場合は、これらの言語が Windows ランタイムをサポートする方法の違いに注意する必要があります。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.

Visual Basic で記述された UWP アプリでのみ使用するコンポーネントを作成する場合またはC#、UWP のコントロール、onsider を使用して、コンポーネントが含まれていない、クラス ライブラリテンプレートの代わりに、 Windowsランタイム コンポーネントMicrosoft Visual Studio でプロジェクト テンプレート。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 onsider using the Class Library template instead of the Windows Runtime Component project template in Microsoft Visual Studio. 単純なクラス ライブラリでは、制限は少なくなります。There are fewer restrictions on a simple class library.

Windows ランタイム コンポーネントでの型の宣言Declaring types in Windows Runtime Components

内部的には、コンポーネントでは Windows ランタイム型では、UWP アプリで許可されている .NET Framework の機能を使用できます。Internally, the Windows Runtime types in your component can use any .NET Framework functionality that's allowed in a UWP app. 詳細については、次を参照してください。 UWP アプリ用 .NETします。For more info, see .NET for UWP apps.

外部で、型のメンバーは、そのパラメーターの Windows ランタイム型のみを公開および戻り値。Externally, the members of your types can expose only Windows Runtime types for their parameters and return values. 次の一覧では、Windows ランタイム コンポーネントから公開されている .NET Framework 型の制限事項について説明します。The following list describes the limitations on .NET Framework types that are exposed from a Windows Runtime Component.

  • コンポーネント内にあるすべてのパブリック型とメンバーのフィールド、パラメーター、戻り値は、Windows ランタイム型である必要があります。The fields, parameters, and return values of all the public types and members in your component must be Windows Runtime types. この制限には、Windows ランタイム型と Windows ランタイム自体によって提供される型を作成するが含まれます。This restriction includes the Windows Runtime types that you author as well as types that are provided by the Windows Runtime itself. また、さまざまな .NET Framework 型も対象となります。It also includes a number of .NET Framework types. これらの型を含めることは、一部のサポートは、.NET Framework は、マネージ コードで、Windows ランタイムの自然な使用を有効にする—基になる Windows ランタイム型ではなく、使い慣れた .NET Framework の型を使用するユーザー コードが表示されます。The inclusion of these types is part of the support the .NET Framework provides to enable the natural use of the Windows Runtime in managed code—your code appears to use familiar .NET Framework types instead of the underlying Windows Runtime types. たとえば、.NET Framework のプリミティブ型をなどに使用できますInt32二重などの特定の基本型DateTimeOffsetUri、よく使用されるジェネリック インターフェイスの種類などIEnumerable<T> (Visual Basic では IEnumerable (Of T)) とIDictionary<TKey, TValue> します。For example, you can use .NET Framework 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>. これらのジェネリック型の型引数は Windows ランタイム型である必要がありますに注意してください。Note that the type arguments of these generic types must be Windows Runtime types. これについてのセクションでは説明マネージ コードに渡すことの Windows ランタイム型マネージ型の Windows ランタイムへの引き渡し、このトピックで後述します。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.

  • パブリック クラスとインターフェイスには、メソッド、プロパティ、イベントを含めることができます。Public classes and interfaces can contain methods, properties, and events. イベントのデリゲートを宣言したり、使用して、 EventHandler<T> を委任します。You can declare delegates for your events, or use the EventHandler<T> delegate. パブリック クラスまたはインターフェイスは使用できません。A public class or interface can't:

    • ジェネリックにする。Be generic.
    • インターフェイスは、Windows ランタイム インターフェイスを実装する (ただし、独自の Windows ランタイム インターフェイスを作成およびそれらを実装できます)。Implement an interface that is not a Windows Runtime interface (however, you can create your own Windows Runtime interfaces and implement them).
    • など、Windows ランタイムでない型から派生するSystem.ExceptionSystem.EventArgsします。Derive from types that are not in the Windows Runtime, such as System.Exception and System.EventArgs.
  • すべてのパブリック型にはアセンブリ名に一致するルート名前空間が必要になります。ただし、アセンブリ名の先頭には "Windows" を付けることはできません。All public types must have a root namespace that matches the assembly name, and the assembly name must not begin with "Windows".

    ヒント: します。Tip. 既定では、Visual Studio プロジェクトは、アセンブリ名に一致する名前空間の名前があります。By default, Visual Studio projects have namespace names that match the assembly name. Visual Basic では、この既定の名前空間の Namespace ステートメントはコードに表示されません。In Visual Basic, the Namespace statement for this default namespace is not shown in your code.

  • パブリック構造体はパブリック フィールド以外のメンバーを持つことができません。また、それらのフィールドは値型または文字列であることが必要です。Public structures can't have any members other than public fields, and those fields must be value types or strings.

  • パブリック クラスは sealed (Visual Basic では NotInheritable) であることが必要です。Public classes must be sealed (NotInheritable in Visual Basic). プログラミング モデルがポリモーフィズムを必要とできますインターフェイスは、パブリック インターフェイスを作成し、ポリモーフィックをする必要があるクラスにそのインターフェイスを実装します。If your programming model requires polymorphism, then you can create a public interface, and implement that interface on the classes that must be polymorphic.

コンポーネントのデバッグDebugging your component

UWP アプリとコンポーネントの両方がマネージ コードに組み込まれている場合、それらをデバッグできます両方同時に。If both your UWP app and your component are built with managed code, then you can debug them both at the same time.

C++ を使った UWP アプリの一部としてコンポーネントをテストする際に、同時にマネージ コードとネイティブ コードをデバッグできます。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. 既定では、ネイティブ コードのみになります。The default is native code only.

ネイティブ C++ コードとマネージ コードの両方をデバッグするにはTo debug both native C++ code and managed code

  1. Visual C++ プロジェクトのショートカット メニューを開き、 [プロパティ] をクリックします。Open the shortcut menu for your Visual C++ project, and choose Properties.
  2. プロパティ ページの [構成プロパティ] で、 [デバッグ] を選びます。In the property pages, under Configuration Properties, choose Debugging.
  3. [デバッガーの種類] を選び、ドロップダウン リスト ボックスで、 [ネイティブのみ][混合 (マネージとネイティブ)] に変更します。Choose Debugger Type, and in the drop-down list box change Native Only to Mixed (Managed and Native). [OK] をクリックします。Choose OK.
  4. ネイティブ コードとマネージ コードのブレークポイントを設定します。Set breakpoints in native and managed code.

JavaScript を使用して UWP アプリの一部としてコンポーネントをテストするときに既定では、ソリューションは JavaScript デバッグ モード。When you're testing your component as part of a UWP app using JavaScript, by default the solution is in JavaScript debugging mode. Visual Studio では、JavaScript とマネージ コードを同時にデバッグすることはできません。In Visual Studio, you can't debug JavaScript and managed code at the same time.

JavaScript ではなくマネージ コードをデバッグするにはTo debug managed code instead of JavaScript

  1. JavaScript プロジェクトのショートカット メニューを開き、 [プロパティ] を選びます。Open the shortcut menu for your JavaScript project, and choose Properties.
  2. プロパティ ページの [構成プロパティ] で、 [デバッグ] を選びます。In the property pages, under Configuration Properties, choose Debugging.
  3. [デバッガーの種類] を選び、ドロップダウン リスト ボックスで、 [スクリプトのみ][マネージのみ] に変更します。Choose Debugger Type, and in the drop-down list box change Script Only to Managed Only. [OK] をクリックします。Choose OK.
  4. マネージ コードのブレークポイントを設定し、通常どおりにデバッグします。Set breakpoints in managed code and debug as usual.

マネージ コードへの Windows ランタイム型の引き渡しPassing Windows Runtime types to managed code

セクションで説明したようWindows ランタイム コンポーネントの宣言型、特定の .NET Framework の型がパブリック クラスのメンバーのシグネチャに表示できます。As mentioned previously in the section Declaring types in Windows Runtime Components, certain .NET Framework types can appear in the signatures of members of public classes. これは、マネージ コードで Windows ランタイムを通常どおりに使うことができるようにするために、.NET Framework が提供するサポートの一部です。This is part of the support that the .NET Framework provides to enable the natural use of the Windows Runtime in managed code. これには、プリミティブ型と一部のクラスやインターフェイスが含まれます。It includes primitive types and some classes and interfaces. 、JavaScript または C++ コードからコンポーネントを使用する場合は、呼び出し元に、.NET Framework の型がどのように表示されるかを知る必要があります。When your component is used from JavaScript, or from C++ code, it's important to know how your .NET Framework types appear to the caller. 参照してくださいチュートリアル。単純なコンポーネントを作成するC#または Visual Basic、および JavaScript による呼び出しの JavaScript の例。See Walkthrough: Creating a simple component in C# or Visual Basic and calling it from JavaScript for examples with JavaScript. このセクションでは、よく使われる型について説明します。This section discusses commonly used types.

.NET Framework のプリミティブ型など、 Int32構造がある多くの便利なプロパティおよびメソッドなど、 TryParseメソッド。In the .NET Framework, primitive types such as the Int32 structure have many useful properties and methods, such as the TryParse method. これに対して、Windows ランタイムのプリミティブ型と構造体は、フィールドしか保持していません。By contrast, primitive types and structures in the Windows Runtime only have fields. これらの型をマネージ コードに渡すと、.NET Framework 型のように表示され、通常どおりに .NET Framework のプロパティとメソッドを使うことができます。When you pass these types to managed code, they appear to be .NET Framework types, and you can use the properties and methods of the .NET Framework types as you normally would. IDE で自動的に行われる置き換えの概要を次に示します。The following list summarizes the substitutions that are made automatically in the IDE:

  • Windows ランタイムのプリミティブのInt32Int64単一二重ブール文字列(変更できないコレクションの Unicode 文字)、 EnumUInt32UInt64、およびGuid、System 名前空間で同じ名前の型を使用します。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.
  • UInt8を使用して、 System.Byteします。For UInt8, use System.Byte.
  • Char16を使用して、 System.Charします。For Char16, use System.Char.
  • IInspectableインターフェイスを使用してSystem.Objectします。For the IInspectable interface, use System.Object.

場合C#または Visual Basic がこれらの種類のいずれかの言語のキーワードを提供し、代わりに、言語キーワードを使用することができます。If C# or Visual Basic provides a language keyword for any of these types, then you can use the language keyword instead.

プリミティブ型に加えて、よく使用される基本的な Windows ランタイム型が、同等の .NET Framework 型としてマネージ コードに表示されます。In addition to primitive types, some basic, commonly used Windows Runtime types appear in managed code as their .NET Framework equivalents. たとえば、JavaScript のコードで使用して、 Windows.Foundation.Uriクラスしたい場合に渡す、C#または Visual Basic のメソッド。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. マネージ コードの等価の型は .NET Framework System.Uriクラス、メソッド パラメーターに使用する型です。The equivalent type in managed code is the .NET Framework System.Uri class, and that's the type to use for the method parameter. マネージ コードを記述するとき、Visual Studio の IntelliSense によって Windows ランタイム型が表示されなくなり、同等の .NET Framework 型が示されるため、Windows ランタイム型が .NET Framework 型として表示されていることがわかります You can tell when a Windows Runtime type appears as a .NET Framework type, because IntelliSense in Visual Studio hides the Windows Runtime type when you're writing managed code, and presents the equivalent .NET Framework type. (通常、2 つの型の名前は同じです。(Usually the two types have the same name. ただし、注意、 Windows.Foundation.DateTimeとしてマネージ コードの構造が表示されますSystem.DateTimeOffsetではなくSystem.DateTime。)。However, note that the Windows.Foundation.DateTime structure appears in managed code as System.DateTimeOffset and not as System.DateTime.)

よく使われるコレクション型の一部では、Windows ランタイム型によって実装されるインターフェイスと、対応する .NET Framework 型によって実装されるインターフェイスと間で対応付けが行われます。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 Framework type. 上で説明した型と同じように、.NET Framework 型を使ってパラメーターの型を宣言する必要があります。As with the types mentioned above, you declare parameter types by using the .NET Framework type. これにより、型の間にある相違点を意識せずに、.NET Framework コードを通常どおりに記述することができます。This hides some differences between the types and makes writing .NET Framework code more natural.

次の表は、最も一般的なジェネリック インターフェイスの型、および他の一般的なクラスやインターフェイスに関する対応付けを示しています。The following table lists the most common of these generic interface types, along with other common class and interface mappings. .NET Framework がマップされる Windows ランタイム型の完全な一覧を参照してください。 Windows ランタイム型の .NET Framework のマッピングします。For a complete list of Windows Runtime types that the .NET Framework maps, see .NET Framework mappings of Windows Runtime types.

Windows ランタイムWindows Runtime .NET Framework.NET Framework
IIterable<T>IIterable<T> IEnumerable<T>IEnumerable<T>
IVector<T>IVector<T> IList<T>IList<T>
IVectorView<T>IVectorView<T> IReadOnlyList<T>IReadOnlyList<T>
IMap<K, V>IMap<K, V> IDictionary<TKey, TValue>IDictionary<TKey, TValue>
IMapView<K, V>IMapView<K, V> IReadOnlyDictionary<TKey, TValue>IReadOnlyDictionary<TKey, TValue>
IKeyValuePair<K, V>IKeyValuePair<K, V> KeyValuePair<TKey, TValue>KeyValuePair<TKey, TValue>
IBindableIterableIBindableIterable IEnumerableIEnumerable
IBindableVectorIBindableVector 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

型によって複数のインターフェイスが実装される場合、メンバーのパラメーターの型または戻り値の型として実装されるインターフェイスをすべて使うことができます。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. たとえば、渡すか返す、ディクショナリ<int、文字列> (Dictionary (Of Integer, String) Visual Basic で) としてIDictionary<int、文字列>IReadOnlyDictionary<int、文字列> 、またはIEnumerable<System.Collections.Generic.KeyValuePair<TKey, TValue>> します。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>>.

重要

JavaScript では、マネージ型を実装するインターフェイスの一覧の先頭に表示されるインターフェイスを使用します。JavaScript uses the interface that appears first in the list of interfaces that a managed type implements. たとえば、値を返す場合ディクショナリ<int、文字列> として表示される JavaScript コードにIDictionary<int、文字列> 関係なく戻り値の型として指定するインターフェイスです。For 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. つまり、後のインターフェイスにメンバーが最初のインターフェイスに含まれていない場合、そのメンバーは JavaScript では認識されません。This means that if the first interface doesn't include a member that appears on later interfaces, that member isn't visible to JavaScript.

Windows ランタイムでIMap<K, V>IMapView<K, V> IKeyValuePair を使用して反復されます。In the Windows Runtime, IMap<K, V> and IMapView<K, V> are iterated by using IKeyValuePair. として表示されるときに、マネージ コードに渡す、 IDictionary<TKey, TValue>IReadOnlyDictionary<TKey, TValue> ので、使用する自然System.Collections.Generic.KeyValuePair<TKey, TValue> それらを列挙します。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.

インターフェイスがマネージ コード内に表示される方法によって、これらのインターフェイスを実装する型の表示方法が決まります。The way interfaces appear in managed code affects the way types that implement these interfaces appear. たとえば、 PropertySetクラスが実装するIMap<K, V> 、としてマネージ コードに表示されるIDictionary<TKey、TValue> .For example, the PropertySet class implements IMap<K, V>, which appears in managed code as IDictionary<TKey, TValue>. PropertySetが実装された場合のように見えるIDictionary<TKey, TValue> の代わりにIMap<K, V> 管理で、コードが表示されます、追加メソッドのような動作、追加メソッド .NET Framework のディクショナリ。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 Framework dictionaries. ないように見えます、挿入メソッド。It doesn't appear to have an Insert method. この例では、トピックを確認できますチュートリアル。単純なコンポーネントを作成するC#または Visual Basic、および JavaScript による呼び出しします。You can see this example in the topic Walkthrough: Creating a simple component in C# or Visual Basic and calling it from JavaScript.

Windows ランタイムへのマネージ型の引き渡しPassing managed types to the Windows Runtime

前のセクションで説明したように、一部の Windows ランタイム型は、コンポーネントのメンバーのシグニチャ内、または IDE で使う場合は Windows ランタイム メンバーのシグニチャ内で、.NET Framework 型として表示される場合があります。As discussed in the previous section, some Windows Runtime types can appear as .NET Framework types in the signatures of your component's members, or in the signatures of Windows Runtime members when you use them in the IDE. .NET Framework 型をこれらのメンバーに渡すか、またはコンポーネントのメンバーの戻り値として使うと、対応する Windows ランタイム型として Windows ランタイム側のコードに表示されます。When you pass .NET Framework 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. コンポーネントが JavaScript から呼び出されたときにこのことがあります、効果の例については、マネージ型を返すコンポーネントから"のセクションでチュートリアル。単純なコンポーネントを作成するC#または Visual Basic、および 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: Creating a simple component in C# or Visual Basic and calling it from JavaScript.

オーバー ロードされたメソッドOverloaded methods

Windows ランタイムでは、メソッドはオーバーロードできます。In the Windows Runtime, methods can be overloaded. ただし場合に、同じ数のパラメーターを持つ複数のオーバー ロードを宣言すると、適用、 Windows.Foundation.Metadata.DefaultOverloadAttribute 属性をこれらのオーバー ロードの 1 つだけです。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. この属性が適用されるオーバーロードが、JavaScript から呼び出すことができる唯一のオーバーロードになります。That overload is the only one you can call from JavaScript. たとえば、次のコードでは、int (Visual Basic では Integer) を受け取るオーバーロードが既定のオーバーロードです。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

[重要]JavaScript を使用すると、任意の値を渡すOverloadExample、および値パラメーターで必要な型を強制します。[IMPORTANT] JavaScript allows you to pass any value to OverloadExample, and coerces the value to the type that is required by the parameter. 呼び出すことができますOverloadExampleを"forty-two"、「42」、または 42.3、ですが、すべての値が既定のオーバー ロードに渡されます。You can call OverloadExample with "forty-two", "42", or 42.3, but all those values are passed to the default overload. 前の例では既定のオーバー ロードは、0、42、および 42 をそれぞれ返します。The default overload in the previous example returns 0, 42, and 42, respectively.

適用することはできません、 DefaultOverloadAttribute 属性コンス トラクターにします。You can't apply the DefaultOverloadAttribute attribute to constructors. クラスのすべてのコンストラクターは、異なる数のパラメーターを持つ必要があります。All the constructors in a class must have different numbers of parameters.

IStringable の実装Implementing IStringable

Windows 8.1 以降、Windows ランタイムが含まれています、 IStringableインターフェイスの 1 つのメソッドを持つIStringable.ToString、によって提供されるのと同等の基本的な書式設定サポートを提供します。Object.ToStringします。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. 実装することを選択する場合IStringableで Windows ランタイム コンポーネントでエクスポートしたパブリック マネージ型を次の制限が適用されます。If you do choose to implement IStringable in a public managed type that is exported in a Windows Runtime component, the following restrictions apply:

  • 定義することができます、 IStringableインターフェイスでは、次のコードなどの「クラスが実装する」関係でしかC#:You can define the IStringable interface only in a "class implements" relationship, such as the following code in C#:

    public class NewClass : IStringable
    

    Visual Basic では、次のようになります。Or the following Visual Basic code:

    Public Class NewClass : Implements IStringable
    
  • 実装することはできませんIStringableインターフェイス。You can't implement IStringable on an interface.

  • 型パラメーターを宣言することはできませんIStringableします。You can't declare a parameter to be of type IStringable.

  • IStringableメソッド、プロパティ、またはフィールドの戻り値の型にすることはできません。IStringable can't be the return type of a method, property, or field.

  • 非表示にすることはできません、 IStringable次などのメソッド定義を使用して基底クラスから実装します。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";
       }
    }
    

    代わりに、 IStringable.ToString実装は、基本クラスの実装を常にオーバーライドする必要があります。Instead, the IStringable.ToString implementation must always override the base class implementation. 非表示にすることができます、 ToString厳密に型指定されたクラスのインスタンスで呼び出すによってのみ実装します。You can hide a ToString implementation only by invoking it on a strongly typed class instance.

注意

さまざまな条件、ネイティブ コードから呼び出すを実装するマネージ型にIStringableの表示と非そのToString実装は、予期しない動作を引き起こすことができます。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.

非同期操作Asynchronous operations

コンポーネントでは、非同期メソッドを実装するには、メソッド名の末尾に"Async"を追加し、非同期アクションまたは非同期操作を表す Windows ランタイム インターフェイスのいずれかを返します。IAsyncActionIAsyncActionWithProgress<TProgress>IAsyncOperation<TResult> 、または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>.

.NET Framework のタスクを使用することができます (、 タスククラスとジェネリックタスク<TResult> クラス) に非同期メソッドを実装します。You can use .NET Framework tasks (the Task class and generic Task<TResult> class) to implement your asynchronous method. 記述された非同期のメソッドから返されたタスクなどの実行中の操作を表すタスクを返す必要がありますC#または Visual Basic、またはタスクから返される、 Task.Run メソッド。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. コンストラクターを使ってタスクを作成する場合、その Task.Start メソッドを呼び出してから戻す必要があります。If you use a constructor to create the task, you must call its Task.Start method before returning it.

使用するメソッドawait(Await Visual Basic で) 必要があります、asyncキーワード (Async Visual Basic で)。A method that uses await (Await in Visual Basic) requires the async keyword (Async in Visual Basic). Windows ランタイム コンポーネントからこれらのメソッドを公開する場合は、適用、asyncキーワードをデリゲートに渡す、実行メソッド。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.

取り消しや進行状況の報告をサポートしない非同期アクションと非同期操作では、タスクを適切なインターフェイスにラップするために、WindowsRuntimeSystemExtensions.AsAsyncAction または AsAsyncOperation<TResult> の拡張メソッドを使うことができます。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. 使用して、次のコードが非同期メソッドを実装するなど、 Task.Run<TResult> タスクを開始するメソッド。For example, the following code implements an asynchronous method by using the Task.Run<TResult> method to start a task. AsAsyncOperation<TResult> 拡張メソッドは、Windows ランタイムの非同期操作としてタスクを返します。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

次の JavaScript コードを使用して、メソッドを呼び出す方法を示しています、 WinJS.Promise オブジェクト。The following JavaScript code shows how the method could be called by using a WinJS.Promise object. then メソッドに渡される関数は、非同期呼び出しが完了したときに実行されます。The function that is passed to the then method is executed when the asynchronous call completes. StringList パラメーターにはによって返される文字列のリストが含まれています、 DownloadAsStringAsyncメソッド、および関数は、すべての処理が必要です。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.
        });
}

非同期アクションおよび操作のキャンセルをサポートまたは進行状況レポートを使用、 AsyncInfo 開始されたタスクの生成とフック、キャンセルして、進行状況レポートをクラスタスクのキャンセルと進行状況レポート機能を適切な Windows ランタイム インターフェイスの機能です。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. キャンセルと進行状況レポートの両方をサポートする例について、次を参照してください。チュートリアル。単純なコンポーネントを作成するC#または Visual Basic、および JavaScript による呼び出しします。For an example that supports both cancellation and progress reporting, see Walkthrough: Creating a simple component in C# or Visual Basic and calling it from JavaScript.

メソッドを使用することに注意してください、 AsyncInfoクラスの場合でも、非同期メソッドがキャンセルをサポートまたは進行状況レポートしません。Note that you can use the methods of the AsyncInfo class even if your asynchronous method doesn't support cancellation or progress reporting. Visual Basic のラムダ関数を使用する場合またはC#匿名メソッドは、トークンのパラメーターを指定しないと IProgress<T> インターフェイス。If you use a Visual Basic lambda function or a C# anonymous method, don't supply parameters for the token and IProgress<T> interface. C# のラムダ関数を使う場合は、トークンのパラメーターを指定しますが、無視されます。If you use a C# lambda function, supply a token parameter but ignore it. 前の例で使用、AsAsyncOperation<TResult>メソッドでは、次のようを使用する場合、 AsyncInfo.Run<TResult>(Func<CancellationToken, Task<TResult>> ) メソッド オーバー ロードを代用します。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

必要に応じてキャンセルまたは進行状況レポートをサポートする非同期メソッドを作成する場合は、キャンセル トークンのパラメーターがないオーバー ロードを追加することを検討してくださいまたはIProgress<T> インターフェイスです。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.

例外のスローThrowing exceptions

Windows アプリ用 .NET に含まれている例外の型は、どれでもスローすることができます。You can throw any exception type that is included in the .NET for Windows apps. Windows ランタイム コンポーネントで独自のパブリック型の例外を宣言することはできませんが、非パブリック型を宣言し、スローすることはできます。You can't declare your own public exception types in a Windows Runtime component, but you can declare and throw non-public types.

コンポーネントが例外を処理しない場合は、コンポーネントを呼び出したコードで対応する例外が発生します。If your component doesn't handle the exception, a corresponding exception is raised in the code that called your component. 例外が呼び出し元に表示される方法は、呼び出し元の言語が Windows ランタイムをサポートする方法によって異なります。The way the exception appears to the caller depends on the way the calling language supports the Windows Runtime.

  • JavaScript では、例外はオブジェクトとして表示され、例外メッセージがスタック トレースで置き換えられています。In JavaScript, the exception appears as an object in which the exception message is replaced by a stack trace. Visual Studio でアプリをデバッグするとき、デバッガーの例外ダイアログ ボックスに、"WinRT 情報" として元のメッセージ テキストが表示されます。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". JavaScript コードから元のメッセージ テキストにアクセスすることはできません。You can't access the original message text from JavaScript code.

    ヒント: します。Tip. 現時点では、スタック トレースには、マネージ例外の種類が含まれていますが、例外の種類を識別するためにトレースを解析はお勧めしません。 Currently, the stack trace contains the managed exception type, but we don't recommend parsing the trace to identify the exception type. このセクションの後半で説明するように、代わりに HRESULT 値を使ってください。Instead, use an HRESULT value as described later in this section.

  • C++ では、例外はプラットフォーム例外として表示されます。In C++, the exception appears as a platform exception. マネージ例外の HResult プロパティは、特定のプラットフォーム例外の HRESULT にマップできる場合、は、特定の例外が使用されます。それ以外の場合、 platform::comexception 例外がスローされます。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. マネージ例外のメッセージ テキストは、C++ コードでは利用できません。The message text of the managed exception is not available to C++ code. 特定のプラットフォーム例外がスローされた場合、その例外の型に関する既定のメッセージ テキストが表示されます。それ以外の場合は、メッセージ テキストは表示されません。If a specific platform exception was thrown, the default message text for that exception type appears; otherwise, no message text appears. 例外 (C++/CX)」をご覧ください。See Exceptions (C++/CX).

  • C# または Visual Basic では、例外は通常のマネージ例外です。In C# or Visual Basic, the exception is a normal managed exception.

コンポーネントから例外をスローする場合、コンポーネントに固有の HResult プロパティ値を持つ非パブリック型の例外をスローすることにより、JavaScript や C++ の呼び出し元で例外を簡単に処理できるようになります。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. HRESULT は JavaScript の呼び出し元は例外オブジェクトの数値プロパティを使用して、C++ の呼び出し元で使用可能な comexception::hresult プロパティ。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.

注意

負の値を HRESULT を使用します。Use a negative value for your HRESULT. 正の値は成功と解釈されるので、JavaScript や C++ の呼び出し元で例外がスローされなくなります。A positive value is interpreted as success, and no exception is thrown in the JavaScript or C++ caller.

イベントの宣言と発生Declaring and raising events

イベントのデータを保持する型を宣言する場合、EventArgs は Windows ランタイム型ではないので、EventArgs の代わりに Object から派生させます。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. 使用して、 EventHandler<TEventArgs> イベント、および使用してジェネリック型引数としてイベント引数の型の型として。Use EventHandler<TEventArgs> as the type of the event, and use your event argument type as the generic type argument. イベントは .NET Framework アプリケーションの場合と同様に発生させます。Raise the event just as you would in a .NET Framework application.

Windows ランタイム コンポーネントが JavaScript や C++ で使われる場合、イベントはそれらの言語で想定されている Windows ランタイムのイベント パターンに従います。When your Windows Runtime component is used from JavaScript or C++, the event follows the Windows Runtime event pattern that those languages expect. C# や Visual Basic でコンポーネントを使う場合、イベントは通常の .NET Framework のイベントとして表示されます。When you use the component from C# or Visual Basic, the event appears as an ordinary .NET Framework event. 例が提供されるチュートリアル。単純なコンポーネントを作成するC#または Visual Basic、および JavaScript による呼び出しします。An example is provided in Walkthrough: Creating a simple component in C# or Visual Basic and calling it from JavaScript.

カスタム イベント アクセサーを実装する場合 (Visual Basic では Custom キーワードでイベントを宣言する場合) は、実装で Windows ランタイムのイベント パターンに従う必要があります。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. Windows ランタイム コンポーネントのカスタム イベントおよびイベント アクセサー」をご覧ください。See Custom events and event accessors in Windows Runtime Components. C# や Visual Basic コードでイベントを処理する場合でも、通常の .NET Framework のイベントとして表示されます。Note that when you handle the event from C# or Visual Basic code, it still appears to be an ordinary .NET Framework event.

次のステップNext steps

ユーザーが独自に使う Windows ランタイム コンポーネントを作成した後で、そのコンポーネントにカプセル化されている機能が他の開発者の役に立つ場合があります。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. 他の開発者に配布するためにコンポーネントをパッケージ化する方法は 2 つあります。You have two options for packaging a component for distribution to other developers. マネージ Windows ランタイム コンポーネントの配布」をご覧ください。See Distributing a managed Windows Runtime component.

Visual Basic と C# の言語の機能、および Windows ランタイムに関する .NET Framework のサポートについて詳しくは、「Visual Basic および C# 言語リファレンス」をご覧ください。For more information about Visual Basic and C# language features, and .NET Framework support for the Windows Runtime, see Visual Basic and C# language reference.