以下の内容はhttps://tech.guitarrapc.com/entry/2016/05/27/041358より取得しました。


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

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

https://serverlessconf.io/

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

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

https://tech.guitarrapc.com/entry/2016/04/03/051552

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

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

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

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

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

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

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

さて、今回の記事は、.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.010384.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にあげておいたので、よろしければどうぞ。

https://github.com/guitarrapc/AzureFunctionsIntroduction

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

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

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

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




以上の内容はhttps://tech.guitarrapc.com/entry/2016/05/27/041358より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14