Windows ランタイム コンポーネントのエラー条件の診断

この技術情報では、マネージ コードで記述した Windows ランタイム コンポーネントの制限に関する追加情報を提供します。 Winmdexp.exe (Windows ランタイム メタデータのエクスポート ツール) からのエラー メッセージで提供される情報をさらに詳細に説明し、C++ および Visual Basic での Windows ランタイム コンポーネントの作成 で提供される制約の情報を補足します。

この技術情報はすべてのエラーについて説明しているわけではありません。 ここで説明するエラーは一般カテゴリにグループ化され、各カテゴリには関連付けられたエラー メッセージの表が含まれます。 メッセージ テキスト (プレースホルダーの特定の値を省略) またはメッセージ番号を検索してください。 必要な情報がない場合、この技術情報の末尾にあるフィードバック ボタンを使用してドキュメントの改善にご協力ください。 エラー メッセージを含めます。 また、Microsoft Connect Web サイトでバグを報告できます。

この記事は次のセクションで構成されています。

  • 非同期パターンを実装したときのエラー メッセージで示される型が正しくない

  • mscorlib.dll や System.Runtime.dll への参照が指定されていない

  • 演算子のオーバーロードが許可されていない

  • クラスのコンストラクターに同じ数のパラメーターがある

  • 同じ数のパラメーターを持つオーバーロードには既定値を指定する必要がある

  • 出力ファイルの名前空間のエラーと無効な名前

  • 無効な Windows ランタイム型である型をエクスポートする

  • 使用できない型のフィールドを含む構造体

  • メンバー シグニチャ内の配列の制限

  • 配列パラメーターは配列コンテンツが読み取り可能または書き込み可能かどうかを指定する必要がある

  • "value" という名前のパラメーターを持つメンバー

非同期インターフェイスの実装に関するエラー メッセージで示される型が正しくない

マネージ Windows ランタイム コンポーネントは、非同期アクションまたは非同期操作を表す Windows ランタイム インターフェイスを実装できません (IAsyncActionIAsyncActionWithProgress<TProgress>IAsyncOperation<TResult>、または IAsyncOperationWithProgress<TResult, TProgress>)。 代わりに、.NET Framework には、Windows ランタイム コンポーネントの非同期操作を生成するための AsyncInfo クラスが用意されています。 非同期インターフェイスを実装しようとしたときに Winmdexp.exe により表示されるエラー メッセージでは、このクラスが誤って以前の名前の AsyncInfoFactory として示されます。 .NET Framework の AsyncInfoFactory クラスは廃止されています。

エラー番号

メッセージ テキスト

WME1084

型 '{0}' は Windows ランタイムの非同期インターフェイス '{1}' を実装します。 Windows ランタイム型は、非同期インターフェイスを実装できません。 System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory クラスを使用して、Windows ランタイムへのエクスポート用に非同期操作を生成してください。

mscorlib.dll または System.Runtime.dll への参照が指定されていない

この問題は、コマンド ラインから Winmdexp.exe を使用する場合にのみ発生します。 .NET Framework のコア参照アセンブリから mscorlib.dll および System.Runtime.dll の両方への参照を含めるために /reference オプションを使用することをお勧めします。コア参照アセンブリは、「"%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5」(32 ビット コンピューターの場合は「%ProgramFiles%\...」) にあります。

エラー番号

メッセージ テキスト

WME1009

mscorlib.dll は参照されませんでした。正しくエクスポートするには、このメタデータ ファイルへの参照が必要です。

WME1090

コア参照アセンブリを確認できませんでした。 /reference スイッチを使用して mscorlib.dll および System.Runtime.dll が参照されていることを確認してください。

演算子のオーバーロードが許可されていない

マネージ コードで記述された Windows ランタイム コンポーネントでは、パブリック型のオーバーロードされた演算子を公開することはできません。

注意

エラー メッセージでは、op_Addition、op_Multiply、op_ExclusiveOr、op_Implicit (暗黙の変換) などのメタデータ名によって演算子が識別されます。

エラー番号

メッセージ テキスト

WME1087

'{0}' は演算子オーバーロードです。 マネージ型は Windows ランタイム で演算子オーバーロードを公開できません。

クラスのコンストラクターに同じ数のパラメーターがある

Windows ランタイム クラスでは、指定された数のパラメーターを持つコンストラクターは 1 つしか許されません。たとえば、String 型の単一のパラメーターを持つコンストラクターと int (Visual Basic の Integer) 型の単一のパラメーターを持つコンストラクターを両方持つことはできません。 唯一の回避策は、各コンストラクターで異なる数のパラメーターを使用することです。

エラー番号

メッセージ テキスト

WME1099

型 '{0}' には、'{1}' 個の引数を持つ複数のコンストラクターがあります。 Windows ランタイム 型には、同じ数の引数を持つ複数のコンストラクターがありません。

同じ数のパラメーターを持つオーバーロードには既定値を指定する必要がある

Windows ランタイム では、オーバーロードされたメソッドの 1 つが既定のオーバーロードとして指定されている場合にのみ、同じ数のパラメーターを持つことができます。 「C++ および Visual Basic での Windows ランタイム コンポーネントの作成」にある「オーバーロードされたメソッド」を参照してください。

エラー番号

メッセージ テキスト

WME1059

'{1}.{2}' の複数の {0} パラメーター オーバーロードは、Windows.Foundation.Metadata.DefaultOverloadAttribute で装飾されます。

WME1085

{1}.{2} の {0} パラメーター オーバーロードには、Windows.Foundation.Metadata.DefaultOverloadAttribute で修飾して既定のオーバーロードとして指定されたメソッドが 1 つだけ必要です。

出力ファイルの名前空間のエラーと無効な名前

Windows ランタイム では、Windows メタデータ (.winmd) ファイルのすべてのパブリック型は、.winmd ファイル名を共有する名前空間、またはファイル名のサブ名前空間の中にある必要があります。 たとえば、Visual Studio 2012 プロジェクトの名前が A.B (つまり、Windows ランタイム コンポーネントが A.B.winmd) の場合、パブリック クラス A.B.Class1 と A.B.C.Class2 を含めることができますが、A.Class3 (WME0006) または D.Class4 (WME1044) を含めることはできません。

注意

これらの制限はパブリック型だけに適用され、実装で使用されるプライベート型には適用されません。

A.Class3 の場合、Class3 を別の名前空間に移動するか、Windows ランタイム コンポーネントの名前を A.winmd に変更できます。 WME0006 は警告ですが、エラーとして扱う必要があります。 前の例では、A.B.winmd を呼び出すコードは A.Class3 を特定することはできません。

D.Class4 の場合、ファイル名に D.Class4 と A.B 名前空間のクラスの両方を含めることはできないため、Windows ランタイム コンポーネントの名前を変更することはオプションに含まれません。 D.Class4 を別の名前空間に移動するか、別の Windows ランタイム コンポーネントに配置できます。

ファイル システムは大文字と小文字を区別できないため、大文字小文字が異なる名前空間は許可されません (WME1067)。

コンポーネントには、少なくとも 1 つの public sealed 型 (Visual Basic の Public NotInheritable) を含める必要があります。 含めない場合、コンポーネントにプライベート型が含まれるかどうかに応じて、WME1042 または WME1043 を受け取ります。

Windows ランタイム コンポーネントの型には、名前空間 (WME1068) と同じ名前を付けることはできません。

注意

Winmdexp.exe を直接呼び出し、Windows ランタイム コンポーネントの名前を指定するために /out オプションを使用しない場合、Winmdexp.exe はコンポーネントのすべての名前空間を含めた名前を生成しようとします。名前空間の名前を変更すると、コンポーネントの名前も変更される場合があります。

エラー番号

メッセージ テキスト

WME0006

'{0}' は、このアセンブリに有効な winmd ファイル名ではありません。Windows メタデータ ファイル内のすべての型は、ファイル名で指定される名前空間のサブ名前空間に存在する必要があります。このようなサブ名前空間に存在しない型は、ランタイムに見つかりません。このアセンブリでは、ファイル名として使用できる最も小さい共通の名前空間は '{1}' です。

WME1042

入力モジュールには、名前空間内にある少なくとも 1 つのパブリック型を含める必要があります。

WME1043

入力モジュールには、名前空間内にある少なくとも 1 つのパブリック型を含める必要があります。 名前空間内で検出された型はプライベートのみです。

WME1044

パブリック型の名前空間 ('{1}') は、他の名前空間 ('{0}') と共通プレフィックスを共有しません。 Windows メタデータ ファイル内のすべての型は、ファイル名で指定される名前空間のサブ名前空間に存在する必要があります。

WME1067

名前空間名は、大文字小文字だけを変更しても区別されません: '{0}'、'{1}'。

WME1068

型 '{0}' に、名前空間 '{1}' と同じ名前を指定することはできません。

無効な Windows ランタイム 型である型をエクスポートする

コンポーネントのパブリック インターフェイスは Windows ランタイム 型のみを公開する必要があります。 ただし、.NET Framework では、.NET Framework および Windows ランタイム とはわずかに異なる一般的な型のマッピングを提供しています。 これにより、.NET Framework 開発者は、新たな型を学ぶのではなく、使い慣れた型を使用できます。 マップされた .NET Framework 型は、コンポーネントのパブリック インターフェイスで使用できます。 「C++ および Visual Basic での Windows ランタイム コンポーネントの作成」および「.NET Framework での Windows ランタイム型の対応付け」にある「Windows ランタイム コンポーネントの宣言型」および「Windows ランタイム 型のマネージ コードへの引き渡し」を参照してください。

これらのマッピングの多くはインターフェイスです。 たとえば、IList<T> は Windows ランタイム インターフェイス IVector<T> にマップします。 パラメーター型として IList<string> の代わりに List<string> (Visual Basic の List(Of String)) を使用すると、Winmdexp.exe は代替の一覧を提供し、そこには List<T> によって実装されたすべてのマップされたインターフェイスが含まれます。 List<Dictionary<int, string>> (Visual Basic の List(Of Dictionary(Of Integer, String))) など、入れ子になったジェネリック型を使用する場合、Winmdexp.exe は入れ子のレベルごとに選択肢を提供します。 これらのリストはかなり長くなる場合があります。

一般に、最適なのは型に最も近いインターフェイスです。 たとえば、Dictionary<int, string> の場合、IDictionary<int, string> が最適と考えられます。

重要

JavaScript は、マネージ型が実装するインターフェイスのリストに最初に示されるインターフェイスを使用します。たとえば、JavaScript コードに Dictionary<int, string> を返した場合、戻り値の型としてどのインターフェイスを指定しても IDictionary<int, string> として表示されます。これは、後のインターフェイスに表示されるメンバーが最初のインターフェイスに含まれていない場合、そのメンバーは JavaScript に参照されないことを意味します。

注意

コンポーネントが JavaScript で使用される場合、非ジェネリック IListIEnumerable インターフェイスを使用しないようにします。これらのインターフェイスは、IBindableVector and IBindableIterator にマップします。これらは、XAML コントロールのバインドをサポートし、JavaScript には参照されません。JavaScript は次の実行時エラーを表示します。「The function 'X' has an invalid signature and cannot be called. (関数 'X' に無効なシグニチャがあるため呼び出すことができません)」。

エラー番号

メッセージ テキスト

WME1033

メソッド '{0}' には、型 '{2}' のパラメーター '{1}' が指定されています。'{2}' は、有効な Windows ランタイム パラメーター型ではありません。

WME1038

メソッド '{0}' は、そのシグニチャに型 '{1}' のパラメーターを指定しています。この型は有効な Windows ランタイム型ではありませんが、有効な Windows ランタイム型であるインターフェイスを実装します。メソッド シグニチャを、代わりに次のいずれかの型を使用するように変更することを検討してください: '{2}'。

WME1039

メソッド '{0}' は、そのシグニチャに型 '{1}' のパラメーターを指定しています。 このジェネリック型は有効な Windows ランタイム型ではありませんが、この型またはそのジェネリック パラメーターは、有効な Windows ランタイム型であるインターフェイスを実装します。{2}

メモメモ
{2} の場合、Winmdexp.exe は代替のリストを追加します。たとえば、「メソッド シグニチャの型 'System.Collections.Generic.List<T>' を次のいずれかの型に変更することを検討してください: System.Collections.Generic.IList<T>、System.Collections.Generic.IReadOnlyList<T>、System.Collections.Generic.IEnumerable<T>」。

WME1040

メソッド '{0}' は、そのシグニチャに型 '{1}' のパラメーターを指定しています。管理されているタスク型を使用する代わりに、Windows.Foundation.IAsyncAction、Windows.Foundation.IAsyncOperation、またはその他の Windows ランタイム の非同期インターフェイスのいずれかを使用してください。 標準の .NET await パターンもこれらのインターフェイスに適用されます。管理されているタスク オブジェクトを Windows ランタイム の非同期インターフェイスに変換する方法の詳細については、System.Runtime.InteropServices.WindowsRuntime.AsyncInfo を参照してください。

使用できない型のフィールドを含む構造体

Windows ランタイム では、構造体にはフィールドしか含めることができず、フィールドは構造体にのみ含めることができます。 これらのフィールドはパブリックである必要があります。 有効なフィールド型には、列挙体、構造体、およびプリミティブ型が含まれます。

エラー番号

メッセージ テキスト

WME1060

構造体 '{0}' には、型 '{2}' のフィールド '{1}' が含まれています。'{2}' は有効な Windows ランタイム フィールド型ではありません。 Windows ランタイムの構造体に含まれる各フィールドに指定できるのは、UInt8、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Boolean、String、Enum、または構造体自体のみです。

メンバー シグニチャ内の配列の制限

Windows ランタイム では、メンバー シグニチャの配列は 1 次元で、下限を 0 (ゼロ) に指定する必要があります。 myArray[][] (Visual Basic の myArray()()) など入れ子になった配列型は許可されていません。

注意

この制限は、実装で内部的に使用する配列には適用されません。

エラー番号

メッセージ テキスト

WME1034

メソッド '{0}' は、そのシグニチャに下限が 0 以外の型 '{1}' の配列を指定しています。Windows ランタイム メソッドのシグニチャ内の配列では、下限を 0 に指定する必要があります。

WME1035

メソッド '{0}' は、そのシグニチャに型 '{1}' の多次元配列を指定しています。Windows ランタイム メソッドのシグニチャ内の配列は 1 次元配列にする必要があります。

WME1036

メソッド '{0}' は、そのシグニチャに型 '{1}' の入れ子にされた配列を指定しています。Windows ランタイム メソッドのシグニチャ内の配列を入れ子にすることはできません。

配列パラメーターは配列コンテンツが読み取り可能または書き込み可能かどうかを指定する必要がある

Windows ランタイム では、パラメーターは読み取り専用または書き込み専用に指定する必要があります。 パラメーターは、ref (Visual Basic では OutAttribute 属性のない ByRef) とマークすることはできません。 これは配列のコンテンツに適用されるため、配列パラメーターは配列の内容が読み取り専用または書き込み専用であるかどうかを示す必要があります。 out パラメーター (Visual Basic では OutAttribute 属性のある ByRef パラメーター) の方向は明確ですが、値によって渡される配列パラメーター (Visual Basic の ByVal) はマークする必要があります。 「Windows ランタイム コンポーネントへの配列の引き渡し」を参照してください。

エラー番号

メッセージ テキスト

WME1101

メソッド '{0}' のパラメーター '{1}' は配列で、{2} と {3} の両方が格納されています。 Windows ランタイムでは、配列パラメーターの内容は、読み取り可能または書き込み可能である必要があります。 属性の 1 つを '{1}' から削除してください。

WME1102

メソッド '{0}' の出力パラメーター '{1}' は配列ですが、{2} が含まれています。 Windows ランタイムでは、出力配列の内容は書き込み可能です。 '{1}' から属性を削除してください。

WME1103

メソッド '{0}' のパラメーター '{1}' は配列で、System.Runtime.InteropServices.InAttribute または System.Runtime.InteropServices.OutAttribute が指定されています。 Windows ランタイムでは、配列パラメーターに {2} または {3} を指定する必要があります。 これらの属性を削除するか、必要に応じて、適切な Windows ランタイム属性と置き換えてください。

WME1104

メソッド '{0}' のパラメーター '{1}' は、配列ではなく、{2} または {3} が指定されています。 Windows ランタイムでは、配列でないパラメーターを {2} または {3} でマークすることがサポートされていません。

WME1105

メソッド '{0}' に、System.Runtime.InteropServices.InAttribute または System.Runtime.InteropServices.OutAttribute が指定されたパラメーター '{1}' があります。 Windows ランタイムでは、System.Runtime.InteropServices.InAttribute または System.Runtime.InteropServices.OutAttribute でパラメーターをマークすることはサポートされていません。 System.Runtime.InteropServices.InAttribute を削除して、代わりに、System.Runtime.InteropServices.OutAttribute を 'out' 修飾子に置き換えることを検討してください。

メソッド '{0}' に、System.Runtime.InteropServices.InAttribute または System.Runtime.InteropServices.OutAttribute が指定されたパラメーター '{1}' があります。 Windows ランタイムでは、System.Runtime.InteropServices.OutAttribute で ByRef パラメーターをマークすることのみサポートされており、これらの属性の他の使用方法はサポートされていません。

WME1106

メソッド '{0}' には、配列パラメーター '{1}' が指定されています。 Windows ランタイムでは、配列パラメーターの内容が読み取り可能または書き込み可能である必要があります。 {2} または {3} を '{1}' に適用してください。

"value" という名前のパラメーターのメンバー

Windows ランタイム では、戻り値は出力パラメーターであると見なされ、パラメーターの名前は一意である必要があります。 既定では、Winmdexp.exe は戻り値に "value" という名前を設定します。 メソッドに "value" という名前のパラメーターがあると、エラー WME1092 が発生します。 これは 2 つの方法で修正できます。

  • パラメーターに "value" 以外の名前を付けます (プロパティ アクセサーの場合は "returnValue" 以外の名前)。

  • 次に示すように、ReturnValueNameAttribute 属性を使用して戻り値の名前を変更します。

    using System.Runtime.InteropServices;
    using System.Runtime.InteropServices.WindowsRuntime;
    
    [return: ReturnValueName("average")]
    public int GetAverage(out int lowValue, out int highValue)
    
    Imports System.Runtime.InteropServices
    Imports System.Runtime.InteropServices.WindowsRuntime
    
    Public Function GetAverage(<Out> ByRef lowValue As Integer, _
    <Out> ByRef highValue As Integer) As <ReturnValueName("average")> String
    

    注意

    戻り値の名前を変更し、新しい名前が別のパラメーターの名前と競合する場合、エラー WME1091 が発生します。

JavaScript コードは、戻り値も含め、メソッドの出力パラメーターに名前でアクセスできます。 例については、ReturnValueNameAttribute 属性に関するトピックを参照してください。

エラー番号

メッセージ テキスト

WME1091

メソッド '{0}' には、パラメーター名と同じ '{1}' という名前の戻り値があります。 Windows ランタイム メソッドのパラメーターと戻り値には一意の名前を指定する必要があります。

WME1092

メソッド '{0}' には、既定の戻り値の名前と同じ '{1}' という名前のパラメーターが指定されています。 パラメーターに別の名前を使用することを検討するか、System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute を使用して、戻り値の名前を明示的に指定してください。

メモメモ
既定名は、プロパティ アクセサーの場合 "returnValue" となり、その他のすべてのメソッドでは、既定名は "value" となります。

参照

関連項目

Winmdexp.exe (Windows ランタイム メタデータのエクスポート ツール)

概念

C++ および Visual Basic での Windows ランタイム コンポーネントの作成