UWP アプリ開発メモ

証明書の有効期間が切れて申請用パッケージの作成に失敗する時の、更新方法

  1. VS で当該プロジェクトを開く
  2. [ソリューション エクスプローラー] で当該プロジェクトを右クリックし、プロパティを表示する
  3. [アプリケーション] タブを選択し、[パッケージ マニフェスト] ボタンをクリックする
  4. [パッケージ化] タブをクリックし、[発行者] テキストボックスに表示されている文字列をコピーしておく(後で使用する)
  5. [証明書の選択...] ボタンをクリックする
  6. [証明書の構成] ボタンをクリックし、[テスト証明書の作成...] ボタンをクリックする
  7. [発行者共通名] テキストボックスに、コピーしておいた [発行者] の文字列のうち「CN=」から後ろの文字列を貼り付け、[OK] ボタンをクリックする
  8. 有効期限が更新されていることを確認して、[OK] ボタンをクリックする

補足: 公開中アプリの [発行者共通名] については、Partner Center ダッシュボードで当該アプリを選択し、[App Management] - [App identity] - [Package/Identity/Publisher] の値でも確認できる

「'ValidateAppxPackage' に失敗しました。ファイル '...\Package.StoreAssociation.xml' が見つかりませんでした。」エラーが表示される場合の対処方法

  1. VS で当該プロジェクトを開く
  2. [ソリューション エクスプローラー] で当該プロジェクトを右クリックし、プロパティを表示する
  3. [アプリケーション] タブを選択し、[パッケージ マニフェスト] ボタンをクリックする
  4. [パッケージ化] タブをクリックし、[パッケージ名] テキストボックスに表示されている文字列を控えておく(この画面を表示したまま以降の作業実施でも可)
  5. [ソリューション エクスプローラー] で当該プロジェクトを右クリックし、[ストア] - [アプリケーションをストアと関連付ける] をクリックする
  6. [アプリケーション名を選択] 画面で、[既にパッケージに使用されているアプリケーション名を含める] チェックボックスにチェックを入れ、[既存のアプリケーション名] リストから目的のアプリを選択する。[Windows ストア内のパッケージ ID] 情報が、事前に確認していた [パッケージ名] の ID と合っているか、確認しておく
  7. 本当にこのアプリで合っているかなどの確認が表示されるので、問題なければ [次へ] ボタンをクリックする
  8. [関連付け] ボタンをクリックして、関連付けを行う。"Package.StoreAssociation.xml" ファイルが生成される

Release ビルドでの実行時に System.Reflection.MissingMetadataException が発生する場合の対処方法

Debug ビルドでは問題ないが、Release ビルドで実行した際に以下のようなエラーが発生する場合がある。

System.Reflection.MissingMetadataException
  HResult=0x80131543
  Message=Reflection_InsufficientMetadata_NoHelpAvailable: EETypeRva:0x00022f50. For more information, visit http://go.microsoft.com/fwlink/?LinkId=623485

JsonConvert を使ったリフレクションなどが行われる箇所で発生している可能性があるかも。 この場合、xxx.rd.xml と言う名前のファイルをプロジェクトに追加する必要がある。

ただ、xxx.rd.xml ファイルには発生しているエラーに沿った内容を記述する必要があり、これが結構困難。ここでは自分が解決できた方法を例として載せるが、本当にこれで適切に記述できているかは正直不明。

  1. Release ビルドでは例外がスローされても具体的に何を処理しようとしてエラーとなったかが不明なので、Debug ビルドで例外を起こす必要がある。ただしこのエラーは Release ビルド特有の最適化が影響しており、Debug ビルドでは既定で無効になっているので、これを有効にした上で Debug 実行を行い、例外の詳細を確認する必要がある。
    アプリのプロジェクトのプロパティを表示し、[ビルド] - [.NET ネイティブ ツール チェーンでコンパイルする] チェックボックスにチェックを付けてからビルドする

  2. 今度は例外スロー時に、以下のようにもう少し詳細な情報が出力される

  System.Reflection.MissingMetadataException
    HResult=0x80131543
    Message='Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder' is missing metadata. For more 
  information, please visit http://go.microsoft.com/fwlink/?LinkID=392859

上記の Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder が問題を解決すべき対象となる。

  1. 上記のように missing metadata とか出たら、完全に xxx.rd.xml が必要なパターンなので、以下の処理を行う
  2. アプリのプロジェクトに xxx.rd.xml みたいなファイルが含まれない場合は、プロジェクトにファイルを追加する。名前は default.rd.xml とかにする。また、ファイルのビルドアクションは "コンテンツ" とする
  3. default.rd.xml の内容を以下のようにする
<?xml version="1.0" encoding="utf-8"?>
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <!--<Type Name="Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder" Dynamic="Required All" />-->
    <Namespace Name="Microsoft.CSharp.RuntimeBinder" Dynamic="Required All" />
  </Application>
</Directives>

上記では初め Type 指定で Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder を指定したのだが、Microsoft.CSharp.RuntimeBinder 名前空間の別の型でまた同じ例外が起きてしまったので、型レベルではなく、名前空間で指定している。自分の場合は上記内容で本例外を回避することが出来た。