C# を書く環境として、Visual StudioやLinqPad、Visual Studio Codeが良く話題になります。特にサクッとコード片を試す、インタラクティブにトライアンドエラーをしたいとなると、LinqPad (特にPremium) が素晴らしいです。
LinqPadに関しては、素晴らしいブログ記事があるのでぜひとも目を通されるといいでしょう。
https://takeshik.org/blog/2014/12/06/try-linqpad/
https://takeshik.org/blog/2016/02/12/linqpad-interactive-rx/
チャットでやり取りしているとLinqPadなど他ツールを立ち上げること自体が億劫になります。ツールを切り替えるのは非常にコストが高く、コード片を試したい・共有したい、あるいはチャット上でコードを実行したいとき、チャット上でボットにお願いして評価させると楽です。そんな時に利用できるのが、Roslyn の Scripting API + AzureFunctionsです。
とはいえ、SlackでOutgoing Webhooksを使ったチャットのコード評価ボットに関する素晴らしい記事がすでにあります。
今回はこの素晴らしい知見を基に、Lineや他チャットなど汎用的なWebhookをJSON経由で評価できるようにしてみましょう。
Roslyn Scripting API の分離
Slack Outgoing Webhookと汎用JSON Webhookの両方でC# Scriptingを使うので、評価部分だけCSharpScripting.csxとしてコードを分離します。利用したいrun.csxは、#loadコマンドで呼び出せるようになり二重管理から解放されます。
元記事に加えて、外部を叩いたりできるように参照をごそっと追加します。
https://gist.github.com/guitarrapc/fab39b7ce0534a17c5c11de521313c7e
これで、評価したいコードをstringとして渡せばRoslynが実行してくれるようになりました。
Webhook 用にFunction を作成する
続いて、application/json形式で入力されたWebhookを受け入れるAzure FunctionsとしてCSharpCompilerWebhookCSharpを作成します。

https://gist.github.com/guitarrapc/27aeb3cf04b98df394d3b570d14e4c85
function.jsonに注意です。SlackのslashcommandやOutgoing Webhookと違い、GenericJsonとしてください。
Roslynコード評価を外に出したので、run.csxがとてもシンプルになりました。
検証
サンプルとして、Azure Functions画面上でテストしてみます。google.comページのソース文字数を数えてみましょう。
https://gist.github.com/guitarrapc/87ab95a0e965a7e184772f8e3ac64275
うまくいきましたね。
new System.Net.Http.HttpClient().GetStringAsync("https://google.com").Result.Length
![]()
Slack Outgoing Webhook も修正してみる
とはいっても元記事そのままで、C# コード評価部分だけ外を参照するだけです。ただし、0.2に上げた場合は、以下の設定に変わります。

https://gist.github.com/guitarrapc/4bb29bdb9f18310da5a2d4da458c2a60
こちらも問題なく実行されましたね。
@C#: Enumerable.Range(10, 20).Aggregate((x, y) => x + y)

まとめ
今回のものも、GitHubに載せておきました。
Roslyn ScriptingによるC#コード評価は非常に簡単ですが、既存の何かに載せるにはサンドボックスだったり色々考慮が必要です。
こういった環境を気にしないといけないものこそAzureFunctionsに寄せると、不用意なリークも防げるため安全がある程度担保されます。
素晴らしい記事の数々に感謝です。
グラニはC#怖い人によって数年前からすでにChatwork上でコード実行が出来ているのですが、Azure Functionsに実行基盤を移譲できそうでよかったです。