在前面的文章中,我们介绍了如何在.NET Interactive notebook绘制图表和执行SQL。

那么,能不能为.NET Interactive开发交互功能呢?

今天,我们就来演示如何实现。

创建项目

新建类库项目Demo1Extension,需要引用Nuget包Microsoft.DotNet.InteractiveMicrosoft.DotNet.Interactive.CSharp注意:需要选择“包含预发新版”

修改项目文件,增加项目配置:

<ItemGroup><None Include="$(OutputPath)/Demo1Extension.dll" Pack="true" PackagePath="interactive-extensions/dotnet" />
</ItemGroup>

指定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开发自定义扩展相关推荐

  1. Thingworx自定义扩展开发(一)- 开发环境搭建、Extension Demo Coding

    系列 Thingworx自定义扩展开发(一)- 开发环境搭建.Extension Demo Coding Thingworx自定义扩展开发(二)- Widget Demo Coding Thingwo ...

  2. Thingworx自定义扩展开发(二)- Widget Demo Coding

    系列 Thingworx自定义扩展开发(一)- 开发环境搭建.Extension Demo Coding Thingworx自定义扩展开发(二)- Widget Demo Coding Thingwo ...

  3. Thingworx自定义扩展开发(三)- echarts集成

    系列 Thingworx自定义扩展开发(一)- 开发环境搭建.Extension Demo Coding Thingworx自定义扩展开发(二)- Widget Demo Coding Thingwo ...

  4. my97DatePicker 自定义扩展方法(实现备忘录)

    昨天在经理安排下,提出一个需求,显示出日历,并在日历上显示特殊日期,当鼠标移动至此日期时,弹出div,显示当天具体的操作信息.在网上与园子里查找一段时间,并没有准确的demo,所以无奈只有自己研究,二 ...

  5. 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)

    一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

  6. BizTalk开发系列(二十二) 开发自定义Map Functoid

    更多内容请查看:BizTalk动手实验系列目录                       BizTalk 开发系列 尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作 ...

  7. Chrome 插件下载、安装、加载正在开发的扩展程序和打包扩展程序

    chrome vpn插件: https://www.jianshu.com/p/ba37c62b8f5e 怎么下载谷歌浏览器插件? 下载方法有好多种,我就说我知道的吧. 我常用的有两种 https:/ ...

  8. SharePoint 2013 自定义扩展菜单

    在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...

  9. Chrome开发自定义右键菜单实现快速跳转到指定页面

    一.背景 假设我们在日常的测试过程中,有很多页面需要经常访问,一种方式是我们可以直接把这些页面添加为书签,但这种方式必须记录完整的URL.如果我们有多套环境,比如有测试环境.UAT环境.线上环境,每套 ...

最新文章

  1. 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
  2. 交换机、路由器启动过程详述
  3. vue mixins
  4. 09-Flutter移动电商实战-移动商城数据请求实战
  5. 工业互联网智能智造-工业企业大数据汇聚通道-产品设计
  6. C++复习 auto
  7. 如何优化js代码(2)——for循环
  8. shell脚本积累(不断更新)
  9. 《操作系统实战 45 讲》14 Linux初始化(上):GRUB与vmlinuz的结构(学习笔记)
  10. 小型数控雕刻机制作Arduino_微型CNC制作基于开源项目GRBL
  11. 一口气用Python写了13个小游戏(附源码)
  12. dh算法 理论依据_DH算法为什么属于非对称加密算法?
  13. 《精通Unreal Engine 3 卷1:3D游戏关卡设计》
  14. 浅析数据中心存储发展趋势
  15. 1000句最常用英语口语 (四)
  16. recovery之刷机脚本自定义(解决刷zip文件时出现Status 6错误)
  17. 智能船舶概况(国内篇)
  18. 印象笔记不能同步(其他浏览器可以上网,IE不能上网)
  19. 使用linux蓝牙指南
  20. aliyun-oss-02

热门文章

  1. 斑马无线打印服务器,如何设置斑马打印机无线WiFi
  2. eclipse如何调试(Debug)程序(zhuan)
  3. 关于jstl.jar引用问题及解决方法
  4. 关于visual studio类视图和资源视图不显示类和资源的问题
  5. js(jQuery)获取时间的方法及常用时间类
  6. 如何在Domino中使用文本文件注册用户
  7. Teams AppId, InstallationId 和 ExternalId 的区别
  8. 如何将多个Android Wear手表与单个手机配对
  9. 亚马逊标题自动抓取_如何为您的家人提供自动Amazon礼品卡津贴
  10. plex实现流媒体服务器_如何从Plex Media Server离线查看下载和同步媒体