使用C#为.NET Interactive开发自定义扩展
在前面的文章中,我們介紹了如何在.NET Interactive notebook繪制圖表和執行SQL。
那么,能不能為.NET Interactive開發交互功能呢?
今天,我們就來演示如何實現。
創建項目
新建類庫項目Demo1Extension,需要引用Nuget包Microsoft.DotNet.Interactive和Microsoft.DotNet.Interactive.CSharp。注意:需要選擇“包含預發新版”
修改項目文件,增加項目配置:
指定PackagePath不能改,否則無法加載擴展
新增自定義擴展類
創建Demo1KernelExtension類,實現IKernelExtension。
這里有個坑:?類名必須以KernelExtension結尾,否則無法加載擴展。這個默認規則太隱晦了,害我試了半天。
自定義格式化
可以為指定Type實現自定義格式化輸出。
這里我們以string為例:
public?class?Demo1KernelExtension?:?IKernelExtension {public?Task?OnLoadAsync(Microsoft.DotNet.Interactive.Kernel?kernel){//指定輸出格式Formatter.SetPreferredMimeTypeFor(typeof(string),?HtmlFormatter.MimeType);Formatter.Register<string>((str,?writer)?=>{writer.Write(DrawHtml(str));},?HtmlFormatter.MimeType);return?Task.CompletedTask;}public?static?IHtmlContent?DrawHtml(string?str){var?id?=?"div"?+?Guid.NewGuid().ToString("N");var?div?=?PocketViewTags.div[id:?id](PocketViewTags.h1[style:?"color:#F00"](str.ToString()));return?div;} }我們將輸入的字符串格式化成了Html輸出,格式為“<div?id='xxx'><h1?style='color:#F00'>輸入字符串</h1></div>”。
測試
首先,執行下面命令,生成Nuget包:
dotnet?builddotnet?pack?/p:PackageVersion=1.0.0然后,在VS Code中創建.NET Interactive notebook,并引用上面生成的Nuget包:
#i?D:\codes\Demo1Extension\Demo1Extension\bin\Debug #r?"nuget:Demo1Extension,1.0.0"由于我們剛才生成的Nuget包還在本地,所以需要用#i命令設置加載位置。
出現下面提示,就表明擴展加載成功,否則請檢查上面說過的注意事項:
輸入一個字符串,執行,返回正常:
自定義命令
還可以實現自定義命令。
這里,我們增加了一個#!demo1命令,它接受一個字符串參數,并輸出Html:
public?Task?OnLoadAsync(Microsoft.DotNet.Interactive.Kernel?kernel) {var?command?=?new?Command("#!demo1",?"it's?a?demo?extension");command.AddArgument(new?Argument());command.Handler?=?CommandHandler.Create((string?str,?KernelInvocationContext?invocationContext)?=>{invocationContext.Display(DrawHtml("demo1:?"+str));});kernel.AddDirective(command);return?Task.CompletedTask; }再次生成Nuget包并引用,記得修改一下版本號。
執行命令,返回正常:
結論
在本文中,我們演示了如何創建.NET Interactive notebook自定義擴展。
關于自定義擴展的詳細API,可以參看官方文檔:https://github.com/dotnet/interactive/blob/main/docs/extending-dotnet-interactive.md。
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“,記住我!
總結
以上是生活随笔為你收集整理的使用C#为.NET Interactive开发自定义扩展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 还在做互联网创业梦?醒醒!
- 下一篇: asp.net core 6 新特性,支