C# および Visual Basic を使用した Windows ランタイム コンポーネントWindows Runtime components with C# and Visual Basic

マネージコードを使用して、独自の Windows ランタイム型を作成し、Windows ランタイムコンポーネントでパッケージ化することができます。You can use managed code to create your own Windows Runtime types and package them in a Windows Runtime component. コンポーネントは、、JavaScript、Visual Basic、またはC++ C#で記述されたユニバーサル Windows プラットフォーム (UWP) アプリで使用できます。You can use your component in Universal Windows Platform (UWP) apps that are written in C++, JavaScript, Visual Basic, or C#. このトピックでは、コンポーネントを作成するための規則を示し、Windows ランタイム向けの .NET のサポートをいくつか説明します。This topic outlines the rules for creating a component, and discusses some aspects of .NET support for the Windows Runtime. このサポートは、通常、.NET のプログラマが意識しなくても利用できるように設計されています。In general, that support is designed to be transparent to the .NET 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 またはC#で記述された uwp アプリでのみ使用するコンポーネントを作成し、コンポーネントに uwp コントロールが含まれていない場合は、 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 機能を使用できます。Internally, the Windows Runtime types in your component can use any .NET 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 型の制限事項について説明します。The following list describes the limitations on .NET 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 型も含まれています。It also includes a number of .NET types. これらの型を含めることは、マネージコードで Windows ランタイムを自然に使用できるようにするために .NET が提供するサポートの一部です。 @ no__t-0your の Windows ランタイム型ではなく、使い慣れた .NET 型を使用するようにコードを表示します。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. たとえば、 Int32Doubleなどの .Net プリミティブ型、 DateTimeOffsetUriなどの特定の基本型、およびIEnumerable @ no__t-5t @ no__t-6 などの一般的に使用されるジェネリックインターフェイス型を使用できます。 (Visual Basic 内の IEnumerable (Of T)) とIDictionary @ No__t-8tkey, TValue @ no__t-9For 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>. これらのジェネリック型の型引数は 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 @ no__t-1t @ no__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).
    • System.exceptionや system.servicemodel など、Windows ランタイムに含まれていない型から派生します。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 型はパブリッククラスのメンバーのシグネチャに表示されることがあります。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. これは、マネージコードで Windows ランタイムを自然に使用できるようにするために .NET が提供するサポートの一部です。This is part of the support that .NET 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 型が呼び出し元にどのように表示されるかを把握しておくことが重要です。When your component is used from JavaScript, or from C++ code, it's important to know how your .NET types appear to the caller. JavaScript を使用した例について C#は、または Visual Basic Windows ランタイムコンポーネントの作成と javascript からの呼び出しに関するチュートリアルを参照してください。See Walkthrough of creating a C# or Visual Basic Windows Runtime component, and calling it from JavaScript for examples with JavaScript. このセクションでは、よく使われる型について説明します。This section discusses commonly used types.

.NET では、 Int32構造体などのプリミティブ型には、 TryParseメソッドなどの便利なプロパティとメソッドが多数あります。In .NET, 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 型であるように見えます。通常どおり、.NET 型のプロパティとメソッドを使用できます。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. IDE で自動的に行われる置き換えの概要を次に示します。The following list summarizes the substitutions that are made automatically in the IDE:

  • Windows ランタイムプリミティブInt32Int64SingleDoubleBooleanString (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.stringを使用します。For UInt8, use System.Byte.
  • Char16を使用する場合は、system.string を使用します。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 に相当するものとしてマネージコードに表示されます。In addition to primitive types, some basic, commonly used Windows Runtime types appear in managed code as their .NET 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 system.stringクラスであり、これはメソッドパラメーターに使用する型です。The equivalent type in managed code is the .NET System.Uri class, and that's the type to use for the method parameter. マネージコードを記述しているときに Visual Studio の IntelliSense によって Windows ランタイム型が非表示になり、同等の .NET 型が表示されるため、Windows ランタイム型が .NET 型として表示されるタイミングを指定できます。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. (通常、2 つの型の名前は同じです。(Usually the two types have the same name. ただし、Windows の. datetime構造体は、system.string としてではなく、system.stringとしてマネージコードに表示されることに注意してください。However, note that the Windows.Foundation.DateTime structure appears in managed code as System.DateTimeOffset and not as System.DateTime.)

一般的に使用されるコレクション型については、Windows ランタイム型によって実装されるインターフェイスと、対応する .NET 型によって実装されるインターフェイスとの間でマッピングが行われます。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. 前述の型と同様に、.NET 型を使用してパラメーターの型を宣言します。As with the types mentioned above, you declare parameter types by using the .NET type. これにより、型のいくつかの違いが隠蔽され、.NET コードをより自然に記述できるようになります。This hides some differences between the types and makes writing .NET code more natural.

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

Windows ランタイムWindows Runtime .NET.NET
IIterable @ no__t-0T @ no__t-1IIterable<T> IEnumerable @ no__t-0T @ no__t-1IEnumerable<T>
IVector @ no__t-0T @ no__t-1IVector<T> IList @ no__t-0T @ no__t-1IList<T>
IVectorView @ no__t-0T @ no__t-1IVectorView<T> IReadOnlyList @ no__t-0T @ no__t-1IReadOnlyList<T>
IMap @ no__t-正常処理, V @ no__t-1IMap<K, V> IDictionary @ no__t-0TKey, TValue @ no__t-1IDictionary<TKey, TValue>
IMapView @ no__t-正常処理, V @ no__t-1IMapView<K, V> Ireadonlydictionary< @ no__t-0TKey, TValue @ no__t-1IReadOnlyDictionary<TKey, TValue>
Ikeyvaluepair<k, @ no__t-正常処理, V @ no__t-1IKeyValuePair<K, V> KeyValuePair @ no__t-0TKey, TValue @ no__t-1KeyValuePair<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. たとえば、辞書 @ no__t-1int、string @ no__t (辞書 (Of Integer、string Visual Basic) as) をIDictionary @ no__t-5int、string @ no__t-6ireadonlydictionary< @ no__t-8int、string @ no__t-9 として渡すか、返すことができます。 、またはIEnumerable @ No__t-11system @ No__t-12tkey, TValue @ no__t-13 @ no__t-14.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. たとえば、辞書 @ no__t-1int, string @ no__t-2を JavaScript コードに返すと、戻り値の型として指定したインターフェイスに関係なく、 IDictionary @ no__t-4int, string @ no__t-5として表示されます。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 @ no__t-1k、v @ no__t-2IMapView @ no__t、v @ no__t-5は ikeyvaluepair<k, を使用して反復処理されます。In the Windows Runtime, IMap<K, V> and IMapView<K, V> are iterated by using IKeyValuePair. これらのコードをマネージコードに渡すと、それらはIDictionary @ no__t-1TKey, TValue @ no__t-2 and ireadonlydictionary< @ No__t-4Tkey, TValue @ no__t-5 として表示されるので、自然に使用します。 KeyValuePair @ no__t-7tkey,TValue @ no__t-8を列挙します。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 @ no__t-2k, V @ no__tを実装します。これは、マネージコードでは、 IDictionary @ No__t-5tkey, TValue @ no__t-6として表示されます。For example, the PropertySet class implements IMap<K, V>, which appears in managed code as IDictionary<TKey, TValue>. PropertySetが実装されているかのように、 IMap @ no__t、V @ 5Kの代わりに、 IDictionary @ No__t-2tkey, TValue @ no__tが実装されているように見えます。マネージコードでは 、Add メソッドのように動作するaddメソッドがあるように見えます。NET 辞書。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. Insertメソッドがないように見えます。It doesn't appear to have an Insert method. この例について C#は、「」または「Visual Basic Windows ランタイムコンポーネントの作成」のチュートリアルと、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.

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

前のセクションで説明したように、一部の Windows ランタイム型は、コンポーネントのメンバーのシグネチャに .NET 型として、または IDE で使用するときに Windows ランタイムメンバーのシグネチャに表示できます。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. これらのメンバーに .NET 型を渡したり、コンポーネントのメンバーの戻り値として使用したりする場合は、対応する Windows ランタイム型として、もう一方の側のコードに表示されます。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. コンポーネントが JavaScript から呼び出されたときの効果の例について C#は、「」の「コンポーネントからマネージ型を返す」セクションを参照してください。または Visual Basic Windows ランタイムコンポーネントの作成と、JavaScriptFor 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.

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

Windows ランタイムでは、メソッドはオーバーロードできます。In the Windows Runtime, methods can be overloaded. ただし、同じ数のパラメーターを持つ複数のオーバーロードを宣言する場合は、これらのオーバーロードのうち1つのみにwindows.foundation.metadata.defaultoverloadattribute属性を適用する必要があります。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. "42"、"42"、または42.3 を使用してOverloadExampleを呼び出すことができますが、これらの値はすべて既定のオーバーロードに渡されます。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インターフェイスが含まれています。このインターフェイスは、単一のメソッドであるistringableを使用して、オブジェクトの 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. Windows ランタイムコンポーネントにエクスポートされるパブリックマネージ型にIstringableを実装する場合は、次の制限が適用されます。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の実装では、常に基底クラスの実装をオーバーライドする必要があります。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 ランタイムインターフェイスの1つを返します。Iasyncactioniasyncactionwithprogress @ No__t-2tprogress @ no__tIAsyncOperation @ no__t-5tresult @ no__t-6、またはIAsyncOperationWithProgress @ no__t-8tresult、tprogress @ no__t-9To 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 タスク (タスククラスと汎用タスク @ No__t-4tresult @ no__t-5クラス) を使用して、非同期メソッドを実装できます。You can use .NET tasks (the Task class and generic Task<TResult> class) to implement your asynchronous method. または Visual Basic でC#記述された非同期メソッドから返されるタスクや、 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.

@No__t-0 (Visual Basic で Await) を使用するメソッドには、async キーワード (@no__t では-3) が必要です。A method that uses await (Await in Visual Basic) requires the async keyword (Async in Visual Basic). このようなメソッドを Windows ランタイムコンポーネントから公開する場合は、 Runメソッドに渡すデリゲートに @no__t 0 キーワードを適用します。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. たとえば、次のコードでは、タスクを使用して非同期メソッドを実装しています。 Run @ no__t-1TResult @ no__t-2メソッドを使用してタスクを開始します。For example, the following code implements an asynchronous method by using the Task.Run<TResult> method to start a task. AsAsyncOperation @ no__t-1TResult @ no__t-2拡張メソッドは、タスクを 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オブジェクトを使用してメソッドを呼び出す方法を示しています。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 Windows ランタイムコンポーネントの作成」と「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.

非同期メソッドがキャンセルまたは進行状況レポートをサポートしていない場合でも、 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 @ No__t-3t @ no__t-4インターフェイスを指定しないでください。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 @ no__t-0TResult @ no__t メソッドが使用されています。この例では、 Asyncinfo. Run @ no__t-4TResult @ no__t-5 (Func @ no__t-6CancellationToken, Task @ no__t-7TResult @ no__t-8 @ no__t-9) メソッドを使用すると、次のようになります。代わりにオーバーロードします。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 @ no__t-1T @ no__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 の呼び出し元が例外オブジェクトの number プロパティを介して使用できます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 @ no__t-2TEventArgs @ no__t-3を使用し、イベントの引数の型をジェネリック型の引数として使用します。Use EventHandler<TEventArgs> as the type of the event, and use your event argument type as the generic type argument. .NET アプリケーションの場合と同じように、イベントを発生させます。Raise the event just as you would in a .NET 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. または Visual Basic からC#コンポーネントを使用する場合、イベントは通常の .net イベントとして表示されます。When you use the component from C# or Visual Basic, the event appears as an ordinary .NET event. または Visual Basic Windows ランタイムコンポーネントを作成し、JavaScript から呼び出す方法については、「」のチュートリアルで説明しています。 C# An example is provided in Walkthrough of creating a C# or Visual Basic Windows Runtime component, 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. または Visual Basic コードからC#イベントを処理する場合は、通常の .net イベントであるように見えます。Note that when you handle the event from C# or Visual Basic code, it still appears to be an ordinary .NET 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 サポートの詳細については、「 Visual Basic C#および言語リファレンス」を参照してください。For more information about Visual Basic and C# language features, and .NET support for the Windows Runtime, see Visual Basic and C# language reference.