tech.guitarrapc.cóm

Technical updates

Azure Functions - C# で Windowsにインストールされている.NET Framework のレジストリバージョンを適切に返してみよう

現在、5/26 -27 で、ニューヨークにて Serverless Conf が行われています。コンテンツホルダーが信じられないぐらい豪華、かつホットな人ばかりなので、動向に注目です。

https://serverlessconf.io/serverlessconf.io

さて、Azure Functions の PMも参加しているように、Azure Functions はServerless という意味で着々とよくなってきています。*1

例えば、Github などとの Continuous Integration。

tech.guitarrapc.com

以前は、新しく push した結果が反映するときに、コンパイルが走ってもコンソールに結果出てこないため、実はコンパイルエラーでした!ということもありました。これが現在は、デプロイした後に Functionのコンソール を開くと、コンパイル結果が表示されるようになっています。とても良いです。CI を組むと、コンソールが Read only になるのはいいのですが、コンパイルも走ってくれなくて困った状況からついに開放です。

また、別の Function に移動して、戻ってきても前回の実行ログが保持されるようにもなっています。

https://github.com/projectkudu/AzureFunctionsPortal/issues/377github.com

1つバグが発生していて、Clear を押してもログが復活してしまいますが、すでにデプロイ待ちのステータスです。

https://github.com/projectkudu/AzureFunctionsPortal/issues/384github.com

こういう更新が、毎日あります。結構面白いので Issue などを眺めているとどう改善していっているかの参考になって個人的に楽しみにしています。

github.com

さて、今回の記事は、.NET Framework のバージョンを確認したいけど、レジストリではわかりにくいケースがあるのでそれを判別するAPIを AzureFunctions に作成してみるというものです。

目次

.NET Framework のバージョン確認

MSDN に記載があります。

To get an accurate list of the .NET Framework versions installed on a computer, you can view the registry or query the registry in code: インストールされている .NET Framework バージョンを確認する - .NET Framework | Microsoft Learn

レジストリです。悪くはないのですが面倒です。

ようはこの関係を取れればいいわけです。

合わせてサンプルも紹介されています。

gist.github.com

ちなみに、このH_KEY_LOCALMACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\ は以下の構成になっています。

{
  "Hive": "LocalMachine",
  "View": "Registry64",
  "SubKeyPath": "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\",
  "IsRegistryKeyExists": true,
  "SubKeyNames": [
    "1033",
    "1041"
  ],
  "EntryNames": [
    "CBS",
    "Install",
    "InstallPath",
    "Release",
    "Servicing",
    "TargetVersion",
    "Version"
  ]
}

リファレンスでは Release の値を取得しておりint が返ってきています。

しかし、実は、Version を取れば 4.6.01038 といったほしいバージョンが取れたりします。なので、int での変換が面倒な場合は、H_KEY_LOCALMACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FullRelease エントリの値を見るのが早いでしょう。おわり。

gist.github.com

AzureFunctions でレジストリの intからバージョンを返す

というのはさみしいので(?)、Release で取得した int を AzureFunctions に投げて、バージョン情報を返すようにします。面倒なので Dictionary で定義を書いていますが、いろいろなサービスから参照することを思うと、手動でいったんok、直すのは AzureFunctions だけというのもいいかと思います。*2

ということで、Function は次の通りです。

gist.github.com

あとはデプロイして、結果を試すと {"Version":"4.6.1"} が返ってきました。

まとめ

今回のサンプルも Github にあげておいたので、よろしければどうぞ。

github.com

あまり自前でこのような変換を作るのは好きではないのですが、この程度なら悪くないでしょう。いろいろな設定や変換を AzureFunctions に閉じ込めるのも手段としてはいいと思って採用してたりします。このような External Configuration store Pattern は、スケーラビリティに大きく寄与するので、採用できる箇所で採用すると嬉しいことが多いですね。*3

*1:成熟には程遠いですが!そこがいいということで

*2:どうしても面倒なら、適当にスクレイピングしましょう。

*3:ただしリトライ処理は大事です