C++/WinRT に関する問題のトラブルシューティングTroubleshooting C++/WinRT issues

注意

インストールと使用について、 C +/cli WinRT Visual Studio Extension (VSIX) (プロジェクト テンプレートのサポートを提供します) を参照してくださいVisual Studio のサポートを c++/cli WinRTFor info about installing and using the C++/WinRT Visual Studio Extension (VSIX) (which provides project template support) see Visual Studio support for C++/WinRT.

このトピックは、すぐに認識していただくための先行情報です。まだ必要としていない場合も同様です。This topic is up front so that you're aware of it right away; even if you don't need it yet. 以下の症状のトラブルシューティングおよび対処法に関する表は、新しいコードを作成しているか既存のアプリを移植しているかにはかかわらず役立つ可能性があります。The table of troubleshooting symptoms and remedies below may be helpful to you whether you're cutting new code or porting an existing app. 移植中であり、進展させてプロジェクトのビルドおよび実行の段階に達することを急いでいる場合は、問題を引き起こしている重要でないコードにコメントアウトまたはスタブ挿入を適用して、一時的に進展させることができます。その後、元に戻ってその借りを解消することになります。If you're porting, and you're eager to forge ahead and get to the stage where your project builds and runs, then you can make temporary progress by commenting or stubbing out any non-essential code that's causing issues, and then returning to pay off that debt later.

よく寄せられる質問の一覧は、次を参照してください。よく寄せられる質問します。For a list of frequently-asked questions, see Frequently-asked questions.

XAML に関する問題の検出Tracking down XAML issues

XAML 解析例外は診断が難しい場合があります。特に、わかりやすいエラー メッセージが例外に含まれていない場合は、診断が難しくなります。XAML parse exceptions can be difficult to diagnose—particularly if there are no meaningful error messages within the exception. デバッガーが初回例外をキャッチするように構成されていることを確してください (早い段階で解析例外のキャッチを試行するため)。Make sure that the debugger is configured to catch first-chance exceptions (to try and catch the parsing exception early on). デバッガーで例外変数を調べて、HRESULT やメッセージ内に役立つ情報が含まれているかどうかを確認できます。You may be able to inspect the exception variable in the debugger to determine whether the HRESULT or message has any useful information. また、XAML パーサーを使って、Visual Studio の出力ウィンドウを調べ、エラー メッセージの出力を確認することもできます。Also, check Visual Studio's output window for error messages output by the XAML parser.

アプリが終了し、XAML マークアップの解析中に処理不能な例外がスローされたことのみがわかっている場合、存在しないリソースへの (キーによる) 参照の結果である可能性があります。If your app terminates and all you know is that an unhandled exception was thrown during XAML markup parsing, then that could be the result of a reference (by key) to a missing resource. または、UserControl、カスタム コントロール、カスタム レイアウト パネルの内部で例外がスローされたことも考えられます。Or, it could be an exception thrown inside a UserControl, a custom control, or a custom layout panel. 最終手段として、バイナリ分割を使うことができます。A last resort is a binary split. XAML ページからマークアップのおよそ半分を削除し、アプリを再実行します。Remove about half of the markup from a XAML Page and re-run the app. これによって、エラーが削除した半分で発生しているか (いずれの場合でも、削除した部分はここで元に戻す必要があります)、または削除しなかった半分で発生しているかがわかります。You will then know whether the error is somewhere inside the half you removed (which you should now restore in any case) or in the half you did not remove. 問題が特定されるまで、エラーを含む半分をさらに分割するプロセスを繰り返します。Repeat the process by splitting the half that contains the error, and so on, until you've zeroed in on the issue.

現象と対処法Symptoms and remedies

現象Symptom 対処法Remedy
実行時に REGDB_E_CLASSNOTREGISTERED の HRESULT 値で例外がスローされます。An exception is thrown at runtime with a HRESULT value of REGDB_E_CLASSNOTREGISTERED. このエラーの原因の 1 つは、Windows ランタイム コンポーネントを読み込むことができないことです。One cause of this error is that your Windows Runtime Component can't be loaded. コンポーネントの Windows ランタイム メタデータ ファイル (.winmd) の名前がコンポーネント バイナリ (.dll) の名前と同じであることを確認してください。この名前は、プロジェクトの名前、およびルート名前空間の名前でもあります。Make sure that the component's Windows Runtime metadata file (.winmd) has the same name as the component binary (the .dll), which is also the name of the project and the name of the root namespace. また、Windows ランタイム メタデータとバイナリが、ビルド プロセスによって使用中のアプリの Appx フォルダに正しくコピーされていることを確認してください。Also make sure that the Windows Runtime metadata and the binary have been corectly copied by the build process to the consuming app's Appx folder. さらに、使用中のアプリの AppxManifest.xml (および Appx フォルダ内) に、アクティブ化可能なクラスとバイナリ名を正しく宣言している <InProcessServer> 要素が含まれていることを確認してください。And confirm that the consuming app's AppxManifest.xml (also in the Appx folder) contains an <InProcessServer> element correctly declaring the activatable class and the binary name. このエラーは、ローカルに実装されたランタイム クラスが、プロジェクションされた型の既定のコンストラクターによって誤ってインスタンス化された場合にも発生する可能性があります。This error can also happen if you make the mistake of instantiating a locally-implemented runtime class via the projected type's default constructor. その場合にプロジェクションされた型を正しく使用する方法の詳細については、「XAML コントロール、C++/WinRT プロパティへのバインド」を参照してください。See XAML controls; bind to a C++/WinRT property for more information about how to correctly use the projected type in that case.
C++ コンパイラーは、" 'implements_type': は、'<プロジェクションされた型>' の直接的または間接的な基底クラスのメンバーではありません" というエラーを生成します。The C++ compiler produces the error "'implements_type': is not a member of any direct or indirect base class of '<projected type>'". これは、実装型 (たとえば MyRuntimeClass) の未修飾名前空間名を使用して、その型のヘッダーを含めずに make を呼び出すと発生する可能性があります。This can happen when you call make with the namespace-unqualified name of your implementation type (MyRuntimeClass, for example), and you haven't included that type's header. コンパイラーは、MyRuntimeClass をプロジェクションされた型として解釈します。The compiler interprets MyRuntimeClass as the projected type. 解決策は、実装型のヘッダーを含めることです (たとえば MyRuntimeClass.h)。The solution is to include the header for your implementation type (MyRuntimeClass.h, for example).
C++ コンパイラーが、"削除された関数を参照しようとしています" というエラーを生成します。The C++ compiler produces the error "attempting to reference a deleted function". これは、make を呼び出し、テンプレート パラメーターとして渡す実装型の既定のコンストラクターが = delete である場合に発生する可能性があります。This can happen when you call make and the implementation type that you pass as the template parameter has an = delete default constructor. 実装型のヘッダー ファイルを編集し、= delete= default に変更してください。Edit the implementation type's header file and change = delete to = default. ランタイム クラスの IDL にコンストラクターを追加することもできます。You can also add a constructor into the IDL for the runtime class.
INotifyPropertyChanged を実装しましたが、XAML バインドが更新されません (そのため、UI が PropertyChanged にサブスクライブしません)。You've implemented INotifyPropertyChanged, but your XAML bindings are not updating (and the UI is not subscribing to PropertyChanged). XAML マークアップのバインド式で必ず Mode=OneWay (または TwoWay) を設定してください。Remember to set Mode=OneWay (or TwoWay) on your binding expression in XAML markup. XAML コントロール: C++/WinRT プロパティへのバインド」を参照してください。See XAML controls; bind to a C++/WinRT property.
XAML アイテム コントロールを監視可能なコレクションにバインドしていますが、実行時に "パラメーターが正しくありません" というメッセージで例外がスローされます。You're binding a XAML items control to an observable collection, and an exception is thrown at runtime with the message "The parameter is incorrect". IDL および実装で、監視可能なコレクションを型 Windows.Foundation.Collections.IVector として宣言します。In your IDL and your implementation, declare any observable collection as the type Windows.Foundation.Collections.IVector. ただし、Windows.Foundation.Collections.IObservableVector を実装するオブジェクトを返します。T は要素型です。But return an object that implements Windows.Foundation.Collections.IObservableVector, where T is your element type. XAML アイテム コントロール: C++/WinRT コレクションへのバインド」を参照してください。See XAML items controls; bind to a C++/WinRT collection.
C++ コンパイラーが、" 'MyImplementationType_base<MyImplementationType>': 使用可能な適切な既定コンストラクターがありません" という形式のエラーを生成します。The C++ compiler produces an error of the form "'MyImplementationType_base<MyImplementationType>': no appropriate default constructor available". これは、非自明なコンストラクターを持つ型から派生させた場合に発生する可能性があります。This can happen when you have derived from a type that has a non-trivial constructor. 派生型のコンストラクターは、基本型のコンストラクターが必要とするパラメーターを渡す必要があります。Your derived type's constructor needs to pass along the parameters that the base type's constructor needs. 実証済みの例については、「非自明なコンストラクタを持つ型からの派生」を参照してください。For a worked example, see Deriving from a type that has a non-trivial constructor.
C++ コンパイラーが、" 'const std::vector<std::wstring,std::allocator<_Ty>>' から 'const winrt::param::async_iterable<winrt::hstring> &' に変換できません" というエラーを生成します。The C++ compiler produces the error "cannot convert from 'const std::vector<std::wstring,std::allocator<_Ty>>' to 'const winrt::param::async_iterable<winrt::hstring> &'". これは、コレクションを予期している Windows ランタイム API に std::wstring の std::vector を渡すときに発生する可能性があります。This can happen when you pass a std::vector of std::wstring to a Windows Runtime API that expects a collection. 詳細については、「標準的な C++ のデータ型と C++/WinRT」を参照してください。For more info, see Standard C++ data types and C++/WinRT.
C++ コンパイラーが、" 'const std::vector<winrt::hstring,std::allocator<_Ty>>' から 'const winrt::param::async_iterable<winrt::hstring> &' に変換できません" というエラーを生成します。The C++ compiler produces the error "cannot convert from 'const std::vector<winrt::hstring,std::allocator<_Ty>>' to 'const winrt::param::async_iterable<winrt::hstring> &'". これは、コレクションを予期している非同期 Windows ランタイム API に winrt::hstring の std::vector を渡すときに、非同期呼び出し先へのベクトルのコピーも移動も行っていない場合に発生する可能性があります。This can happen when you pass a std::vector of winrt::hstring to an asynchronous Windows Runtime API that expects a collection, and you've neither copied nor moved the vector to the async callee. 詳細については、「標準的な C++ のデータ型と C++/WinRT」を参照してください。For more info, see Standard C++ data types and C++/WinRT.
プロジェクトを開くときに、Visual Studio が "プロジェクトのアプリケーションはインストールされていません" というエラーを生成します。When opening a project, Visual Studio produces the error "The application for the project is not installed". まだ行っていない場合は、Visual Studio の [新しいプロジェクト] ダイアログから C++ での開発用の Windows ユニバーサル ツールをインストールする必要があります。If you haven't already, you need to install Windows Universal tools for C++ development from within Visual Studio's New Project dialog. 問題が解決されないかどうかは、c++ に依存プロジェクト/cli WinRT Visual Studio Extension (VSIX) (を参照してくださいVisual Studio のサポートの C +/cli WinRTします。If that doesn't resolve the issue, then the project may depend on the C++/WinRT Visual Studio Extension (VSIX) (see Visual Studio support for C++/WinRT.
Windows アプリ認定キット テストは、いずれかのランタイム クラスのエラーを生成"Windows の基本クラスから派生していません。すべての構成可能なクラスは、最終的に Windows 名前空間内の型から派生する必要があります"。The Windows App Certification Kit tests produce an error that one of your runtime classes "does not derive from a Windows base class. All composable classes must ultimately derive from a type in the Windows namespace". 呼ばれます (つまり、アプリケーション内で宣言した) ランタイムのクラスで、基底クラスから派生した、コンポーザブルクラス。Any runtime class (that you declare in your application) that derives from a base class is known as a composable class. コンポーザブルなクラスの基本クラスは、Windows.* 名前空間で生成された型である必要があります。たとえば、 Windows.UI.Xaml.DependencyObjectします。The ultimate base class of a composable class must be a type originating in a Windows.* namespace; for example, Windows.UI.Xaml.DependencyObject. 参照してくださいXAML コントロール; バインド C +/cli WinRT プロパティの詳細。See XAML controls; bind to a C++/WinRT property for more details.
C++ コンパイラーが、EventHandler または TypedEventHandler のデリゲート特殊化に関して "WinRT 型である必要があります" というエラーを生成します。The C++ compiler produces a "must be WinRT type" error for an EventHandler or TypedEventHandler delegate specialization. 代わりに winrt::delegate<...T> を使用することを考慮してください。Consider using winrt::delegate<...T> instead. C++/WinRT でのイベントの作成」を参照してください。See Author events in C++/WinRT.
C++ コンパイラーが、Windows ランタイムの非同期操作の特殊化に関して "WinRT 型である必要があります" というエラーを生成します。The C++ compiler produces a "must be WinRT type" error for a Windows Runtime asynchronous operation specialization. 代わりに並列パターン ライブラリ (PPL) の task を返すことを考慮してください。Consider returning a Parallel Patterns Library (PPL) task instead. 同時実行操作と非同期操作」を参照してください。See Concurrency and asynchronous operations.
C++ コンパイラーが、"エラー C2220: 警告がエラーとして扱われました - 'オブジェクト' ファイルは生成されませんでした" を生成します。The C++ compiler produces "error C2220: warning treated as error - no 'object' file generated". 警告を修正するか、設定C/C++  > 全般 > 警告をエラーとして扱ういいえ (/WX-) します。Either correct the warning, or set C/C++ > General > Treat Warnings As Errors to No (/WX-).
オブジェクトが破棄された後で C++/WinRT オブジェクトのイベント ハンドラーが呼び出されるため、アプリがクラッシュします。Your app crashes because an event handler in your C++/WinRT object is called after the object has been destroyed. 参照してください安全にアクセスする、このイベント処理デリゲートを使用してポインターします。See Safely accessing the this pointer with an event-handling delegate.
C++ コンパイラは"エラー C2338:これは、弱い参照のサポートにのみ"。The C++ compiler produces "error C2338: This is only for weak ref support". テンプレート引数として winrt::no_weak_ref マーカー構造体を基底クラスに渡した型の、弱参照を要求しています。You're requesting a weak reference for a type that passed the winrt::no_weak_ref marker struct as a template argument to its base class. 参照してください弱い参照のサポートを無効にするします。See Opting out of weak reference support.
C++ リンカーの生成"エラー lnk2019 が発生します。未解決の外部シンボル"The C++ linker produces "error LNK2019: Unresolved external symbol" 参照してください理由は、リンカーを与えてくれた、"LNK2019:未解決の外部シンボル"エラーでしょうか.See Why is the linker giving me a "LNK2019: Unresolved external symbol" error?.
LLVM と Clang ツール チェーン C + を使用すると、エラーが発生する/cli WinRT します。The LLVM and Clang toolchain produces errors when used with C++/WinRT. C++ LLVM と Clang ツール チェーンはサポートされていません/cli の使用方法、内部的には、エミュレートする場合に、WinRT して試して実験で説明されているものなどC + を使用してコンパイルする LLVM/Clang を使用できます/cli WinRT?します。We don't support the LLVM and Clang toolchain for C++/WinRT, but if you wanted to emulate how we use it internally, then you could try an experiment such as the one described in Can I use LLVM/Clang to compile with C++/WinRT?.
C++ コンパイラが生成されます"いない利用可能な適切な既定コンス トラクター"射影された型。The C++ compiler produces "no appropriate default constructor available" for a projected type. ランタイム クラスのオブジェクトの初期化を遅延またはを使用し、同じプロジェクト内のランタイム クラスを実装しているかどうかを呼び出す必要があります、nullptr_tコンス トラクター。If you're trying to delay the initialization of a runtime class object, or to consume and implement a runtime class in the same project, then you'll need to call the nullptr_t constructor. 詳細については、「C++/WinRT での API の使用」を参照してください。For more info, see Consume APIs with C++/WinRT.
C++コンパイラ生成"エラー C3861: 'from_abi': 識別子が見つかりません"、およびその他のエラーから発信されるbase.hします。The C++ compiler produces "error C3861: 'from_abi': identifier not found", and other errors originating in base.h. Visual Studio 2017 を使用している場合は、このエラーを表示可能性があります (バージョン 15.8.0 またはそれ以降)、Windows SDK バージョン 10.0.17134.0 (Windows 10、バージョン 1803) を対象とするとします。You may see this error if you are using Visual Studio 2017 (version 15.8.0 or higher), and targeting the Windows SDK version 10.0.17134.0 (Windows 10, version 1803). いずれかのターゲット以降 (詳細について準拠) のバージョンの Windows SDK、またはプロジェクトのプロパティを設定C/C++ > 言語 > 準拠モード。いいえ(また場合、 /permissive - プロジェクト プロパティに表示されますC/C++ > 言語 > コマンドライン 追加オプションから削除します)。Either target a later (more conformant) version of the Windows SDK, or set project property C/C++ > Language > Conformance mode: No (also, if /permissive- appears in project property C/C++ > Language > Command Line under Additional Options, then delete it).
C++ コンパイラは"エラー C2039:'IUnknown': のメンバーではない '`グローバル名前空間' "。The C++ compiler produces "error C2039: 'IUnknown': is not a member of '`global namespace''". 参照してください方法の再ターゲットすると、C +/cli WinRT プロジェクトは、以降のバージョンの Windows SDK をします。See How to retarget your C++/WinRT project to a later version of the Windows SDK.
C++ リンカーの生成"エラー LNK2019: 未解決の外部シンボル_WINRT_CanUnloadNow@0関数で参照されている_VSDesignerCanUnloadNow@0 "The C++ linker produces "error LNK2019: unresolved external symbol _WINRT_CanUnloadNow@0 referenced in function _VSDesignerCanUnloadNow@0" 参照してください方法の再ターゲットすると、C +/cli WinRT プロジェクトは、以降のバージョンの Windows SDK をします。See How to retarget your C++/WinRT project to a later version of the Windows SDK.
ビルド プロセスには、エラー メッセージが生成されるC+/cli WinRT VSIX プロジェクトのビルドのサポートは提供されなくなりました。Microsoft.Windows.CppWinRT Nuget パッケージへの参照をプロジェクトに追加してくださいします。The build process produces the error message The C++/WinRT VSIX no longer provides project build support. Please add a project reference to the Microsoft.Windows.CppWinRT Nuget package. インストール、 Microsoft.Windows.CppWinRTをプロジェクトに NuGet パッケージ。Install the Microsoft.Windows.CppWinRT NuGet package into your project. 詳細については、次を参照してください。 VSIX 拡張機能の以前のバージョンします。For details, see Earlier versions of the VSIX extension.
C++リンカーは生成エラー LNK2019: 未解決の外部シンボルのメンションをwinrt::impl::consume_Windows_Foundation_Collections_IVectorします。The C++ linker produces error LNK2019: unresolved external symbol, with a mention of winrt::impl::consume_Windows_Foundation_Collections_IVector. C++WinRT 2.0範囲ベースを使用している場合は、 for Windows ランタイムで、今すぐする必要があります#include <winrt/Windows.Foundation.Collections.h>します。As of C++/WinRT 2.0, If you're using a range-based for on a Windows Runtime collection, then you'll now need to #include <winrt/Windows.Foundation.Collections.h>.

注意

このトピックでは、質問に答えしていないかどうかを参照してくださいヘルプを見つけることがあります、開発者コミュニティの Visual Studio C、またはを使用して、 c++-winrt Stack Overflow でタグ付けします。If this topic didn't answer your question, then you might find help by visiting the Visual Studio C++ developer community, or by using the c++-winrt tag on Stack Overflow.