この記事では、マネージド コードで記述された Windows ランタイム コンポーネントの制限に関する追加情報を提供します。 Winmdexp.exe (Windows ランタイム メタデータ エクスポート ツール) からのエラー メッセージで提供される情報を拡張し、C# と Visual Basic を使用して Windows ランタイム コンポーネントで提供される制限に関する情報を補完します。
この記事では、すべてのエラーについては説明しません。 ここで説明するエラーは一般的なカテゴリごとにグループ化され、各カテゴリには関連するエラー メッセージのテーブルが含まれています。 メッセージ テキスト (プレースホルダーの特定の値を省略) またはメッセージ番号を検索します。 ここで必要な情報が見つからない場合は、この記事の最後にあるフィードバック ボタンを使用してドキュメントを改善してください。 エラー メッセージを含めます。 または、Microsoft Connect Web サイトでバグを提出することもできます。
非同期インターフェースを実装する際のエラーメッセージが誤った型を示している
マネージド Windows ランタイム コンポーネントは、非同期アクションまたは操作 (IAsyncAction、IAsyncActionWithProgress<TProgress>、IAsyncOperation<TResult>、または IAsyncOperationWithProgress<TResult、TProgress>) を表すユニバーサル Windows プラットフォーム (UWP) インターフェイスを実装できません。 代わりに、.NET には、Windows ランタイム コンポーネントで非同期操作を生成するための AsyncInfo クラスが用意されています。 非同期インターフェイスを実装しようとしたときに表示 Winmdexp.exe エラー メッセージは、このクラスを以前の名前 AsyncInfoFactory で誤って参照します。 .NET に AsyncInfoFactory クラスが含まれなくなりました。
エラー番号 | メッセージ テキスト |
---|---|
WME1084 | 型 '{0}' は、Windows ランタイム非同期インターフェイス '{1}' を実装します。 Windows ランタイム型は非同期インターフェイスを実装できません。 System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory クラスを使用して、Windows ランタイムへのエクスポート用の非同期操作を生成してください。 |
手記 Windows ランタイムを参照するエラー メッセージでは、古い用語が使用されます。 これは、ユニバーサル Windows プラットフォーム (UWP) と呼ばれるようになりました。 たとえば、Windows ランタイム型は UWP 型と呼ばれるようになりました。
mscorlib.dll または System.Runtime.dll への参照がありません
この問題は、コマンド ラインから Winmdexp.exe を使用する場合にのみ発生します。 /reference オプションを使用して、"%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\ にある .NET Framework コア参照アセンブリからの mscorlib.dll と System.Runtime.dll の両方への参照を含することをお勧めします。NETCore\v4.5" ("%ProgramFiles%\..."32 ビット コンピューター上)。
エラー番号 | メッセージ テキスト |
---|---|
WME1009 | mscorlib.dllへの参照は行われませんでした。 正しくエクスポートするには、このメタデータ ファイルへの参照が必要です。 |
WME1090 | コア参照アセンブリを特定できませんでした。 /reference スイッチを使用して、mscorlib.dll と System.Runtime.dll が参照されていることを確認してください。 |
演算子のオーバーロードは許可されていません
マネージド コードで記述された Windows ランタイム コンポーネントでは、オーバーロードされた演算子をパブリック型で公開することはできません。
手記 エラー メッセージでは、演算子はメタデータ名 (op_Addition、op_Multiply、op_ExclusiveOr、op_Implicit (暗黙的な変換) などによって識別されます。
エラー番号 | メッセージ テキスト |
---|---|
WME1087 | '{0}' は演算子のオーバーロードです。 マネージド型は、Windows ランタイムで演算子のオーバーロードを公開できません。 |
クラスのコンストラクターには、同じ数のパラメーターがあります
UWP では、クラスは、指定された数のパラメーターを持つコンストラクターを 1 つだけ持つことができます。たとえば、 String 型の 1 つのパラメーターを持つコンストラクターと、 int 型の 1 つのパラメーター (Visual Basic の整数 ) を持つコンストラクターを 1 つ持つすることはできません。 唯一の回避策は、コンストラクターごとに異なる数のパラメーターを使用することです。
エラー番号 | メッセージ テキスト |
---|---|
WME1099 | 型 '{0}' には、'{1}' 引数を持つ複数のコンストラクターがあります。 Windows ランタイム型は、同じ数の引数を持つ複数のコンストラクターを持つことはできません。 |
同じ数のパラメーターを持つオーバーロードの既定値を指定する必要があります
UWP では、オーバーロードされたメソッドは、既定のオーバーロードとして 1 つのオーバーロードが指定されている場合にのみ、同じ数のパラメーターを持つことができます。 C# と Visual Basic を使用した Windows ランタイム コンポーネントの「オーバーロードされたメソッド」を参照してください。
エラー番号 | メッセージ テキスト |
---|---|
WME1059 | 複数の {0}パラメーター オーバーロードの '{1}.{2}' には、Windows.Foundation.Metadata.DefaultOverloadAttribute が適用されています。 |
WME1085 | {0}の {1}パラメーター オーバーロード{2} には、Windows.Foundation.Metadata.DefaultOverloadAttribute で修飾することによって、既定のオーバーロードとして正確に 1 つのメソッドを指定する必要があります。 |
出力ファイルに関する名前空間エラーと無効な名称
ユニバーサル Windows プラットフォームでは、Windows メタデータ (.winmd) ファイル内のすべてのパブリック型は、.winmd ファイル名を共有する名前空間、またはファイル名のサブ名前空間内に存在する必要があります。 たとえば、Visual Studio プロジェクトの名前が 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 つの パブリック シールド 型 (Visual Basic ではパブリック NotInheritable) が含まれている必要があります。 そうでない場合は、コンポーネントにプライベート型が含まれているかどうかに応じて、WME1042またはWME1043が表示されます。
Windows ランタイム コンポーネントの型には、名前空間 (WME1068) と同じ名前を付けることはできません。
注意 Winmdexp.exe を直接呼び出し、/out オプションを使用して Windows ランタイム コンポーネントの名前を指定しない場合、Winmdexp.exe はコンポーネント内のすべての名前空間を含む名前の生成を試みます。 名前空間の名前を変更すると、コンポーネントの名前が変更される可能性があります。
エラー番号 | メッセージ テキスト |
---|---|
WME0006 | '{0}' は、このアセンブリの有効な winmd ファイル名ではありません。 Windows メタデータ ファイル内のすべての型は、ファイル名によって暗黙的に示される名前空間のサブ名前空間に存在する必要があります。 このようなサブ名前空間に存在しない型は、実行時に配置できません。 このアセンブリでは、ファイル名として機能する可能性がある最小の共通名前空間は '{1}' です。 |
WME1042 | 入力モジュールには、名前空間内にあるパブリック型が少なくとも 1 つ含まれている必要があります。 |
WME1043 | 入力モジュールには、名前空間内にあるパブリック型が少なくとも 1 つ含まれている必要があります。 名前空間内で見つかった型はプライベートのみです。 |
WME1044 | パブリック型には、他の名前空間 ('{1}') と共通のプレフィックスを共有しない名前空間 ('{0}') があります。 Windows メタデータ ファイル内のすべての型は、ファイル名によって暗黙的に示される名前空間のサブ名前空間に存在する必要があります。 |
WME1067 | 名前空間名は、'{0}'、'{1}' の場合にのみ異なることはできません。 |
WME1068 | 型 '{0}' は名前空間 '{1}' と同じ名前を持つことはできません。 |
ユニバーサル Windows プラットフォームにおいて有効ではない型のエクスポート
コンポーネントのパブリック インターフェイスでは、UWP 型のみを公開する必要があります。 ただし、.NET では、.NET と UWP で若干異なる一般的に使用される型のマッピングが多数用意されています。 これにより、.NET 開発者は新しい型を学習する代わりに使い慣れた型を操作できます。 これらのマップされた .NET 型は、コンポーネントのパブリック インターフェイスで使用できます。 C# と Visual Basic を使用した Windows ランタイム コンポーネントの「Windows ランタイム コンポーネントでの型の宣言」および「ユニバーサル Windows プラットフォーム型をマネージド コードに渡す」、および Windows ランタイム型の .NET マッピングを参照してください。
これらのマッピングの多くはインターフェイスです。 たとえば、 IList<T> は UWP インターフェイス IVector<T> にマップされます。 IList<string> の代わりに ListList(Of String)
string< (Visual Basic の>) をパラメーター型として使用する場合、Winmdexp.exe は List<T> によって実装されたすべてのマップされたインターフェイスを含む代替の一覧を提供します。 入れ子になったジェネリック型 (Visual Basic で List<Dictionary<int、string>> (List(Of Dictionary(Of Integer, String)) など) を使用する場合、Winmdexp.exe は入れ子のレベルごとに選択肢を提供します。 これらのリストは非常に長くなる可能性があります。
一般に、最適な選択肢は、型に最も近いインターフェイスです。 たとえば、Dictionary<int、string> の場合、最適な選択肢は IDictionary<int、string> です。
大事な JavaScript は、マネージド型が実装するインターフェイスの一覧の最初に表示されるインターフェイスを使用します。 たとえば、Dictionary<int、文字列> を JavaScript コードに返すと、戻り値の型として指定したインターフェイスに関係なく、IDictionary<int、文字列> として表示されます。 つまり、最初のインターフェイスに後のインターフェイスに表示されるメンバーが含まれていない場合、そのメンバーは JavaScript に表示されません。
注意 コンポーネントが JavaScript で使用される場合は、非ジェネリック IList および IEnumerable インターフェイスを使用しないでください。 これらのインターフェイスは、それぞれ IBindableVector と IBindableIterator にマップされます。 XAML コントロールのバインドをサポートしており、JavaScript からは見えません。 JavaScript は、実行時エラー "関数 'X' に無効なシグネチャがあり、呼び出すことができません" というエラーを発行します。
エラー番号 | メッセージ テキスト |
---|---|
WME1033 | メソッド '{0}' には、型 '{1}' のパラメーター '{2}' があります。 '{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 を参照してください。 |
許可されていない型のフィールドを含む構造体
UWP では、構造体に含めることができるのはフィールドのみであり、構造体にはフィールドのみを含めることができます。 これらのフィールドはパブリックである必要があります。 有効なフィールド型には、列挙型、構造体、およびプリミティブ型が含まれます。
エラー番号 | メッセージ テキスト |
---|---|
WME1060 | 構造体「{0}」には「{1}」型のフィールド「{2}」があります。 '{2}' は、有効な Windows ランタイム フィールド型ではありません。 Windows ランタイム構造体の各フィールドには、UInt8、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Boolean、String、Enum、またはそれ自体の構造体のみを指定できます。 |
メンバーシグネチャ内の配列に関する制限事項
UWP では、メンバーシグネチャの配列は、下限が 0 (ゼロ) の 1 次元である必要があります。
myArray[][]
(Visual Basic ではmyArray()()
) などの入れ子になった配列型は使用できません。
手記 この制限は、実装で内部的に使用する配列には適用されません。
エラー番号 | メッセージ テキスト |
---|---|
WME1034 | メソッド '{0}' には、シグネチャに 0 以外の下限を持つ '{1}' 型の配列があります。 Windows ランタイム メソッド シグネチャの配列には、下限が 0 である必要があります。 |
WME1035 | メソッド '{0}' には、シグネチャに '{1}' 型の多次元配列があります。 Windows ランタイム メソッドシグネチャの配列は 1 次元である必要があります。 |
WME1036 | メソッド '{0}' には、シグネチャに '{1}' 型の入れ子になった配列があります。 Windows ランタイム メソッド シグネチャ内の配列を入れ子にすることはできません。 |
配列パラメーターは、配列の内容が読み取り可能か書き込み可能かを指定する必要があります
UWP では、パラメーターは読み取り専用または書き込み専用である必要があります。 パラメーターは OutAttribute 属性がない場合、Visual Basic では ref として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}' には、配列であり、System.Runtime.InteropServices.InAttribute または System.Runtime.InteropServices.OutAttribute を持つパラメーター '{1}' があります。 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" という名前のパラメーターを持つメンバー
UWP では、戻り値は出力パラメーターと見なされ、パラメーターの名前は一意である必要があります。 既定では、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" です。
関連トピック
- C# および Visual Basic を使用した Windows ランタイム コンポーネント
- Winmdexp.exe (Windows ランタイム メタデータ エクスポート ツール)