Windows Phone Silverlight から UWP への移植に関するトラブルシューティング

前のトピックは、「プロジェクトの移植」でした。

この移植ガイドは最後まで読むことを強くお勧めしますが、早く先へ進んで、プロジェクトのビルドと実行の段階まで到達したいと思われるのも無理のないことです。 このために、重要でないコードに対してコメント アウトやスタブの挿入を行って一時的に先に進み、後でその部分に戻って対応することもできます。 このトピックには、トラブルシューティングの現象とその対処法を示す表が記載されており、以降のいくつかのトピックに示されている情報に代わるものではありませんが、この段階での作業に役立ちます。 以降のトピックを読み進む中で、いつでもこの表に戻って参考にすることができます。

問題の検出

XAML 解析例外は診断が難しい場合があります。特に、わかりやすいエラー メッセージが例外に含まれていない場合は、診断が難しくなります。 デバッガーが初回例外をキャッチするように構成されていることを確してください (早い段階で解析例外のキャッチを試行するため)。 デバッガーで例外変数を調べて、HRESULT やメッセージ内に役立つ情報が含まれているかどうかを確認できます。 また、XAML パーサーを使って、Visual Studio の出力ウィンドウを調べ、エラー メッセージの出力を確認することもできます。

アプリが終了したとき、確認できたことが、ハンドルされていない例外が XAML マークアップの解析中にスローされたことのみである場合は、存在しないリソース (システム TextBlock スタイル キーなどのキーが Windows 10 アプリには存在せず、Windows Phone Silverlight アプリに存在するリソース) への参照が原因であると考えられます。 または、UserControl、カスタム コントロール、カスタム レイアウト パネルの内部で例外がスローされたことも考えられます。

最終手段として、バイナリ分割を使うことができます。 ページからマークアップのおよそ半分を削除し、アプリを再実行します。 これによって、エラーが削除した半分で発生しているか (いずれの場合でも、削除した部分はここで元に戻す必要があります)、または削除しなかった半分で発生しているかがわかります。 問題が特定されるまで、エラーを含む半分をさらに分割するプロセスを繰り返します。

TargetPlatformVersion

このセクションでは、Visual Studio で Windows 10 プロジェクトを開いたとき、"Visual Studio 更新プログラムが必要。 1 つ以上のプロジェクトでは、インストールされていないか、Visual Studio に対する今後の更新の一部として含まれるプラットフォーム SDK <バージョン> が必要です。" というメッセージが表示されます。

  • まず、インストールされている SDK for Windows 10 のバージョン番号を確認します。 C:\Program Files (x86)\Windows Kits\10\Include\<versionfoldername> に移動し、<versionfoldername> をメモしてください。これは、4 つの部分 "Major.Minor.Build.Revision" から成るバージョン文字列です。
  • 編集用のプロジェクト ファイルを開き、TargetPlatformVersion 要素と TargetPlatformMinVersion 要素を探します。 これらの要素を次のように編集します。<versionfoldername> は、ディスク上で見つけた 4 つの部分から成るバージョン番号に置き換えてください。
   <TargetPlatformVersion><versionfoldername></TargetPlatformVersion>
   <TargetPlatformMinVersion><versionfoldername></TargetPlatformMinVersion>

各現象のトラブルシューティングと対処法

この表の対処法に関する情報では、自身で問題を解消するために十分な情報を提供することが意図されています。 以降のトピックを読み進むことで、こうした各問題についてさらに詳細な情報が提供されます。

症状 解決方法
XAML パーサーまたはコンパイラで、エラー "名前 "<型名>" が名前空間 […] に存在しません" が発生します。 XAML マークアップの名前空間プレフィックス宣言で <型名> がカスタム型である場合は、"clr-namespace" を "using" に変更し、すべてのアセンブリ トークンを削除します。 プラットフォームの種類では、この型はユニバーサル Windows プラットフォーム (UWP) に適用されないことを示すので、相当する要素を見つけ、マークアップを更新します。 直ちに発生する例としては、phone:PhoneApplicationPageshell:SystemTray.IsVisible などが挙げられます。
XAML パーサーまたはコンパイラで、エラー "メンバー "<メンバー名>" が認識されないか、アクセスできません" または "プロパティ "<プロパティ名>" が型 [...] で見つかりませんでした" が発生します。 これらのエラーは、ルート Page など、一部の型名を移植した後に発生し始めます。 メンバーまたはプロパティでは、この型は UWP に適用されないので、相当する要素を見つけ、マークアップを更新します。 直ちに発生する例としては、SupportedOrientationsOrientation などが挙げられます。
XAML パーサーまたはコンパイラで、エラー "接続可能なプロパティ [...] が見つかりませんでした [...]" または "接続可能なメンバー [...] が不明です" が発生します。 これは、添付プロパティではなく、型によって発生します。この場合には、既に該当する型に対してエラーが発生しており、そのエラーを修正すれば、このエラーも解消されます。 直ちに発生する例としては、phone:PhoneApplicationPage.Resourcesphone:PhoneApplicationPage.DataContext などが挙げられます。
XAML のパーサーやコンパイラ、またはランタイム例外で、"リソース '"<リソースキー>" を解決できませんでした" というエラーが発生します。 リソース キーは、ユニバーサル Windows プラットフォーム (UWP) アプリに適用されません。 同等の正しいリソースを探し、マークアップを更新します。 直ちに発生する例としては、PhoneTextNormalStyle などのシステム TextBlock スタイル キーが挙げられます。
C# コンパイラは、"型または名前空間名 '<name>' が見つかりませんでした [...]" または "型または名前空間名 '<name>' が名前空間 [...]" または "型または名前空間名 '<name>' が現在のコンテキストに存在しません" というエラーを示します。 これはおそらく、コンパイラで型に対する適切な UWP の名前空間がまだ認識されていないことを示します。 問題解決のために Visual Studio の [解決] コマンドを使うことができます。
API がユニバーサル デバイス ファミリと呼ばれる API のセットに含まれていない場合 (つまり、API が拡張 SDK で実装されている場合)、拡張 SDK を使います。
移植がそれほど簡単ではない場合もあります。 直ちに発生する例としては、DesignerPropertiesBitmapImage などが挙げられます。
アプリが終了するデバイス上で実行している場合、または Visual Studio からの起動時に、エラー "Windows Runtime 8.x アプリ […] をアクティブ化できません。 アクティベーション要求がエラー "Windows はターゲット アプリケーションと通信できませんでした。 これは通常、ターゲット アプリケーションのプロセスが中止したことを示します。 […]”. この問題は、初期化時に独自のページ、またはバインド プロパティ (またはその他の型) で実行する命令型コードにあることが考えられます。 また、アプリの終了時に表示される XAML ファイルの解析でエラーが発生した可能性があります (Visual Studio から起動した場合は、これは起動ページになります)。 無効なリソース キーを検索するか、このトピックの「問題の検出」セクションのガイダンスを実行します。
XamlCompiler エラー WMC0055: テキスト値 "<ストリーム ジオメトリ>" を "RectangleGeometry" 型の "Clip" プロパティに割り当てることができません UWP では、Microsoft DirectX と XAML C++ UWP アプリの型を使います。
XamlCompiler エラー WMC0001: XML 名前空間 [...] で 'RadialGradientBrush' 型が不明です UWP には、RadialGradientBrush 型がありません。 マークアップから RadialGradientBrush を削除し、Microsoft DirectX と XAML C++ UWP アプリのその他の型を使います。
XamlCompiler エラー WMC0011: 要素 "<UIElement 型>" のメンバー 'OpacityMask' が不明です UWP Microsoft DirectX と XAML C++ UWP アプリ。
'System.Runtime.InteropServices.COMException' 型の最初の例外は、SYSTEM.NI.DLL で発生する可能性があります。 追加情報: アプリケーションは、別のスレッドにマーシャリングされたインターフェイスを呼び出しました。 (HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))。 ここで実行する作業は、UI スレッド上で行う必要があります。 CoreWindow.GetForCurrentThread) を呼び出します。
アニメーションは実行中ですが、ターゲット プロパティに対しては無効です。 アニメーションを独立して実行するか、またはアニメーションに対して EnableDependentAnimation="True" を設定します。 「アニメーション」をご覧ください。
Visual Studio で Windows 10 プロジェクトを開いたとき、"Visual Studio 更新プログラムが必要。 1 つ以上のプロジェクトでは、インストールされていないか、Visual Studio に対する今後の更新の一部として含まれるプラットフォーム SDK <バージョン> が必要です。" というメッセージが表示されます。 このトピックの「TargetPlatformVersion」セクションをご覧ください。
InitializeComponent が xaml.cs ファイルで呼び出されると、System.InvalidCastException がスローされます。 これは、同じ xaml.cs ファイルを共有している xaml ファイルが複数あり (少なくとも 1 つは MRT 修飾されたファイル)、要素が持つ x:Name 属性が 2 つの xaml ファイル間で整合性がとれていない場合に発生することがあります。 両方の xaml ファイルで同じ要素に同じ名前を追加してみるか、どちらの名前も省略してください。

次のトピックは、「XAML と UI の移植」です。