現在、5/26 -27で、ニューヨークにてServerless Confが開催中です。コンテンツホルダーが信じられないぐらい豪華、かつホットな人ばかりなので、動向に注目です。
さて、Azure FunctionsのPMも参加しているように、Azure FunctionsはServerlessという意味で着々とよくなってきています。*1
例えば、GitHubなどとのContinuous Integration。
以前は、新しくpushした結果が反映するときに、コンパイルが走ってもコンソールに結果出てこないため、実はコンパイルエラーでした! ということもありました。これが現在は、デプロイした後にFunctionのコンソールを開くと、コンパイル結果が表示されるようになっています。とても良いです。CIを組むと、コンソールがRead onlyになるのはいいのですが、コンパイルも走ってくれなくて困った状況からついに開放です。

また、別のFunctionに移動して、戻ってきても前回の実行ログが保持されるようにもなっています。
https://github.com/projectkudu/AzureFunctionsPortal/issues/377
1つバグが発生していて、Clearを押してもログが復活してしまいますが、すでにデプロイ待ちのステータスです。
https://github.com/projectkudu/AzureFunctionsPortal/issues/384
こういう更新が、毎日あります。結構面白いので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:
https://msdn.microsoft.com/ja-jp/library/hh925568%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
レジストリです。悪くはないのですが面倒です。
ようはこの関係を取れればいいわけです。

合わせてサンプルも紹介されています。
https://gist.github.com/guitarrapc/d84776dda05ee99d3613ca9a7d7e38fc
ちなみに、この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での変換が面倒な場合は、4.6.01038の4.6.01038エントリの値を見るのが早いでしょう。おわり。
https://gist.github.com/guitarrapc/b55a03e721a1c518fd52b12933502484
AzureFunctions でレジストリの intからバージョンを返す
というのはさみしいので、Releaseで取得したintをAzureFunctionsに投げてバージョン情報を返すようにします。直すのはAzureFunctionsだけで。*2
ということで、Functionは次の通りです。
https://gist.github.com/guitarrapc/c132cc52c6b41b2ed9c021963301be73
あとはデプロイして、結果を試すと{"Version":"4.6.1"}が返ってきました。

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