モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

Windows App SDK に内蔵している MRTCore リソース (resw ファイル) から「R」を生成する R/WinRT を作りました。

 おなじみの。

github.com

1. “R”

 Android の「R」や Apple devices の「R.swift」の Windows 版と思っていただければわかりやすいかと。

R/WinRT

 テストしているのはテキストだけなので、リソースにほかのものが混入しているとどういう動作が起こるかは不明です。

 NuGet パッケージで入れたらうまく扱ってくれるはず(よほど変なことしていない限り)。

2. オプション

 たぶん動くと思います。NuGet パッケージで使う場合は、msbuild の設定 (csproj, vcxproj) に設定を追加すれば行けると思います。

I will create the document of english version as soon as possible. Sorry, guys.

コマンド msbuild プロパティー 説明
-i, --input なし 入力リソースをフルパスで指定します。相対パスはちゃんと定義されていたら動くと思います。
-e, --exclude MntoneResourceExcludeResourceNames 生成を除外したいリソースのファイル名を指定します。例えば Resources.lang-ja-JP.resw であれば Resources です。カンマで複数指定できます。
-o, --output MntoneResourceGeneratedFilesDir 出力先を指定します。出力先を変えると、自動的に参照されているパスが狂うため非推奨です。
-f, --filename MntoneResourceGenerateFileName 出力ファイル名(コマンドで拡張子なしとありますが、拡張子を含めての指定です)C# では Resources.g.csC++ では res.g.h がデフォルトです。
-n, --namespace MntoneResourceGenerateRootNamespace ルート名前空間です。
--impl-namespace MntoneResourceGenerateImplNamespace ルート名前空間に対してネストする実装名前空間です。C# では __ImplC++ では __impl がデフォルトです。
-d, --default MntoneResourceGenerateDefaultResources ルート名前空間に展開するデフォルトのリソース名を指定します。デフォルトは Resources です。指定方法は exclude と同じです。
-indent MntoneResourceGenerateIndent インデント指定です。Tab, Space1, ... と指定できるように実装していますが、現在非対応です。
-l, --language (DefaultResourceLanguage) デフォルトリソース言語指定です。これをもとに自動生成のソースコードにコメントを追加します。
--linebreak MntoneResourceGenerateLineBreak 改行コードの指定です。LF, CR, CRLF が指定できます。
--mode [0.0.2a以降] MntoneResourceGenerateMode 自動生成コードのモード指定です。現在は 1 (Simple) と 2 (Advanced) に対応しています。将来のために数字は予約されており、デフォルトでは int の最大値が指定されており、自動的に最新版に更新されます。生成コードが気に食わない場合は、--mode 1 を指定してお使いください。
--public [0.0.2a以降] MntoneResourcePublic 自動生成コードのアクセスレベルを指定します。デフォルトで false (internal) です。

3. 最後に

 msbuild の理解が深まって、こういうツールをビルドパイプラインに組み込めるのが判明したので、C++ 版を作るついでに C# も作りました。検証は碌にしていない上に、テストコードもないので、動作に関しては期待しないでくださいの Ver. 0.0.1-alpha

 とりあえず、古いたたき上げコードが微妙に残っていたりするんで、気が向いたらそれ直すかも。

 ただ、ポジティブ☆デスクトップAngel Umbrellaの開発を再開したいので、あまり触る時間はないかもです。

mntone.hateblo.jp

 C++ 版のコードは、実質これがバージョン 3 の実装なので、かなり洗練されています。もともとのバージョン 2 はポジティブ☆デスクトップに使われていて、これをコンセプトに作っています(参考にしただけなので結果的に出力されるコードはかなり違います)。

github.com

 C# 版のコードはまだ最適化が不十分だと思われるので、PR の方で投げてくれれば対応します。C# 版はぶっちゃけ自分のやる気がない(C++/WinRT で使うのがメイン)ので、マジで C#er の方が手直ししていただけると助かります🙏🏻

2023/1/22 追記

 C# 向けに Autogen V3 を作りました。V2 のほうがいくらか効率的な機械語を吐き出す模様。

github.com

 現状

により、new せず構造体をキャッシュすることで V2 と同じコードが生成されるんじゃないのか、って考えている。C# の最適化コードに関しては研究中。。。