現在、5/26 -27 で、ニューヨークにて Serverless Conf が行われています。コンテンツホルダーが信じられないぐらい豪華、かつホットな人ばかりなので、動向に注目です。
https://serverlessconf.io/serverlessconf.io
さて、Azure Functions の PMも参加しているように、Azure Functions はServerless という意味で着々とよくなってきています。*1
例えば、Github などとの Continuous Integration。
以前は、新しく 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 などを眺めているとどう改善していっているかの参考になって個人的に楽しみにしています。
さて、今回の記事は、.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
レジストリです。悪くはないのですが面倒です。
ようはこの関係を取れればいいわけです。
合わせてサンプルも紹介されています。
ちなみに、この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\Full
の Release
エントリの値を見るのが早いでしょう。おわり。
AzureFunctions でレジストリの intからバージョンを返す
というのはさみしいので(?)、Release で取得した int を AzureFunctions に投げて、バージョン情報を返すようにします。面倒なので Dictionary で定義を書いていますが、いろいろなサービスから参照することを思うと、手動でいったんok、直すのは AzureFunctions だけというのもいいかと思います。*2
ということで、Function は次の通りです。
あとはデプロイして、結果を試すと {"Version":"4.6.1"}
が返ってきました。
まとめ
今回のサンプルも Github にあげておいたので、よろしければどうぞ。
あまり自前でこのような変換を作るのは好きではないのですが、この程度なら悪くないでしょう。いろいろな設定や変換を AzureFunctions に閉じ込めるのも手段としてはいいと思って採用してたりします。このような External Configuration store Pattern は、スケーラビリティに大きく寄与するので、採用できる箇所で採用すると嬉しいことが多いですね。*3