2022/11/30

パッケージされたアプリのファイルの保存場所

AppDataフォルダーへのファイル作成について、発見があったのでメモしておきます。

1. 基本

Microsoftストア用にパッケージされたデスクトップアプリの場合、設定情報等の保存場所としては基本的に以下の3通りがあります。
  • WinRTのApplicationData.LocalSettings
  • WinRTのApplicationData.LocalFolderに作成したファイル
  • AppDataフォルダー(に作成したフォルダー)に作成したファイル
1番目と2番目はUWP用のものですが、パッケージされたアプリであればこれらを使えます。3番目は、使い方は普通のアプリと同じですが、実際のAppDataフォルダーではなく、OSが管理する別の場所に自動的にリダイレクトされるところが違います。

これらのファイルはアプリのアンインストール時に自動的に削除されます。つまり、アプリの実行ファイルのみならず、その作成する情報・ファイルもOSがまとめて管理することで、ゴミとなるファイルを残さずきれいに削除できるようにしているわけです。
ちなみに、AppDataフォルダー以外にもアクセス権に応じてファイルは作成できますが、あえてやることでもなし。

2. 発見

ここまではDesktop Bridgeの基本ですが、3番目について、ふとしたことから例外があるのに気づきました。

すなわち、アプリをインストールした後、最初にAppDataフォルダーにファイルを作成しようとした際に、
  1. AppDataフォルダーに指定のフォルダーが存在しない場合、自動的にリダイレクト先の場所が作成され、以後のアクセスはその場所になる。実際のAppDataフォルダーには何も作成されない。これは公式情報どおり。

  2. AddDataフォルダーに指定と同名のフォルダーが既に存在する場合、そのフォルダーにファイルが作成される。このファイルはアプリをアンインストールしても削除されない。
この2通りのどちらになるかは、最初にアクセスしたときに決まるようです。一旦、1.になった後は、AppDataフォルダーに同名のフォルダーを作成しても、ファイルはそこに作成されません。

開発環境では、パッケージされた状態で実行するときもあれば、されていない状態で実行するときもあり、2.のようなケースがあるのには何となく気づいていましたが、改めて確認したところ、こういうことだったと。

これがどういう意味を持つかというと、例えば、ユーザーごとのTempフォルダーであるAppData\Local\Tempに作成するファイルはリダイレクトされないし、作成された後はアプリをアンインストールしても自動的に削除されないということになります。

他人のことはあまり言えませんが、説明が足らないと思います。

2022/06/06

Razer Pro Click Mini

ゲーミングマウスの性能で高速スクロール可能なモバイルマウスがほしいという願望がずっとあって、サブに使っていたMX AnyWhere 2Sの買い替えを機に、Razer Pro Click Miniを買ってきた。

エクステリアデザインはエクセレント。Logicoolのモバイルマウスの最上位ラインはちょこちょこデザインを変えてきているが、「こういうのでいいんだよ」をとてもきれいにまとめた感じ。一応チェックした大きい方のRazer Pro Clickは縁にクロームのラインをあしらっているが、別にそういうのは要らない。

製品としては明らかにMX AnyWhere 3の対抗馬で、バッテリーが固定内蔵でないのが違うが、重量は単3一本の状態で実測でほぼ同じ(4g軽い)なので、使用上は大きな違いはない。単4一本にすればさらに軽くできる。
  • Pro Click Mini: 92g(単3一本)
  • Pro Click Mini: 81g(単4一本アダプター込み)
  • MX AnyWhere 3: 96g

ちなみに、上面蓋をどう固定しているのかと思ったら、本体の最後部にマグネットが仕込んであって、それで蓋のネジを引き付ける仕組みになっていた。したがって、爪が折れたりする心配とは無縁だが、机から落としたりすると簡単に外れて飛んでいくので、それはそれで注意が必要かも。

追随性とかは自分には正直差が分からないので、確認点はクリック音とホイールの回転。

クリック音


Pro Click Miniはクリック音が小さいのを売りの一つにしているが、確かに小さい。擬音的には、「カチッ」というより、小さく「ポクッ」という感じで、音が小さくかつ低音なので響かない。まあこれは、むしろLogicoolがMX AnyWhereのラインで重視していないのが謎な点ではある。

ホイール


まずフリーホイールとの切り替えはホイール手前のシーソースイッチで行うが、これが少し硬い。ただ、自分は常にフリーホイールで使うので(TrackPointで鍛えられた人間なので、ノッチに頼らなくても支障はない)、むしろ勝手に変わらなくてよい。

ホイールにはラバーに四角錐が5個並んだ滑り止めが施されている。

肝心のホイールの回転については、MX AnyWhere 3の極まったホイール(無音・無抵抗で、ブレもなく、とてもよく回る)に比べると、回転音がしてかすかにブレがある分、少し劣ると言わざるを得ない。シフトスイッチのあるMX AnyWhere 2Sよりも劣るので、この点はLogicoolに一日の長があるのだろうと思う。

ただ、これは極まったMX Anywhere 3と比べての話で、実用上の問題はない。

まとめ


結論としては、クリック音の小ささではPro Click Miniに、ホイールの回転ではMX AnyWhere 3に軍配が上がる。どちらも使い倒すけど。

2022/06/03

.NET 5でのアプリの更新

Microsoftストアで公開したアプリはストアのAPIを使って更新できますが、.NET 5以降は変わった点があるので、メモしておきます。 更新の際に出るダイアログのために、このオーナーとなるWindowを先に登録する必要がありますが、これは.NET 5より以前は以下のようなものでした。 見てのとおり、COMのIInitializeWithWindowを定義しておいて、StoreContextのインスタンスをこれにキャストするものですが、.NET 5以降はInvalidCastExceptionが出て実行できなくなります。

このための修正としては、usingにWinRTを加えた上でAsでIInitializeWithWindowキャストする。 もしくは、WinRT.Interop.InitializeWithWindow.Initializeを使う。これが公式に出ている方法で、StoreContextをキャストする必要がなく、したがってCOMの定義も要らなくなるので、やるならこちらだと思います。 これを含めた更新のためのヘルパークラスの全体は以下のようになります。