多语言笔记系列:使用导入魔法命令

使用导入魔法命令 #!import

笔记本中中,可以管理和使用nuget包,非常方便。

但只使用Nuget包,远远不够。还可以在不将其复制到笔记本的情况下,引用其它笔记、脚本文件(C#、F#、Powershell、Python等语言脚本)、C#编译后的Dll类文件等,并且在后续代码中使用引用执行后的结果。

#!import 魔法命令提供了这一功能。运行时,#!import 命令会从指定路径读取文件,并立即执行其中的代码。对于包含多个单元格的导入笔记本文件,这些单元格将按照它们在文件中出现的顺序运行。

支持的导入类型

由于.NET Interactive支持多种语言,#!import魔法命令可以识别多种语言。如果指定的文件是支持多种语言的格式,例如.ipynb或.dib,那么文件中的不同代码片段将使用其相应的子内核运行,只要导入的内核有对应语言的子内核。

但是#!import不仅仅限于导入其他笔记本文件,它还可以直接加载已知语言的源代码文件,包括:

文件扩展名 详情
.cs 通用C#(注意:这些将使用C#脚本编译器进行编译。)
.csx C# 脚本
.fs 通用F# 脚本
.fsx F# 脚本
.html HTML
.js JavaScript
.ps1 PowerShell

导入其它笔记文件

真实使用时,比如做教程、写项目演示文档等,都是有很多文档。有些效果要在多外文档中演示;有些脚本、Nuget包、Dll文件等在多个文档中都需要引入;有些需要做成工具类,到处使用等等。

这时,把公共部分提出来,放在单独的文档中编辑好效果,供其它文档引用;这样非常方便。

简单导入示例:运行单元格看效果

  • 相对路径:相对当前文档目录
csharp 复制代码
#!import shared/doc/Hello.ipynb
  • 相对路径:相对当前文档目录
csharp 复制代码
#!import ./shared/doc/Hello.ipynb
  • 绝对路径:因为路径太固定,换个位置或换台电脑,就不能执行。 可使用下面的动态导入
csharp 复制代码
//执行很可能报错,看下面 "动态导入"
#!import "C:\Users\ruyu\Desktop\多语言笔记学习\Docs\shared\doc\Hello.ipynb"

动态导入(高级导入)

使用绝对路径时,可移置性就太差啦!或者 需要导入10个或不确定的多个文件,那就很繁琐甚至无法完成。我总结了一个高级的动态用法。

  • 示例1:利用C#程序,多次执行导入
csharp 复制代码
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
{ //动态执行:多次执行

    for(int i=0; i<3; i++)
    {
        await Kernel.Root.SendAsync(new SubmitCode( $"#!import ./shared/doc/Hello.ipynb",  "csharp"));
    }
}
  • 示例2:利用C#程序,灵活设置各种目录
csharp 复制代码
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
{ //动态执行:绝对路径(当前目录转换为绝对目录,增加可移置性与灵活性)

    string currentDic = Environment.CurrentDirectory;
    string fullPath = System.IO.Path.Combine(currentDic,"shared/doc/Hello.ipynb");

    await Kernel.Root.SendAsync(new SubmitCode( $"#!import {fullPath}",  "csharp"));
}

综合应用

创建一个 初始化文档 ini.ipynb, 统一放置:公用nuget包引用、公用命名空间引用、公共对象、公用方法与共享变量等,供其它文档统一引用进行初始化。

csharp 复制代码
#!import "./shared/doc/Ini.ipynb"
  • 使用导入文档中引用 nuget 包及引用的命名空间
csharp 复制代码
//使用 Newtonsoft.Json
var person = new {Name = "张三", Age = 52};

//没有引用命名空间要写全
var jsonText1 = Newtonsoft.Json.JsonConvert.SerializeObject(person);
Console.WriteLine(jsonText1);

//初始化文档中引入了之后
var jsonText2 = JsonConvert.SerializeObject(person);

Console.WriteLine(jsonText2);
  • 使用导入文档中的公用类
csharp 复制代码
Student student = new Student(){Id=2, Name = "王安全", Age = 12};
student.Display();
  • 用导入文档中的公用变量
csharp 复制代码
SharedStudent.Display();
  • 使用导入文档中的公用方法(静态方法做工具类)
csharp 复制代码
var s = StudentToString(SharedStudent);
s.Display();

导入 C# 脚本

csharp 复制代码
#!import "./shared/script/tools.cs"
csharp 复制代码
//作用C#脚本功能
var callTools = Tools.GetCurrentPath();
callTools.Display();

导入 PowerShell 脚本

pwsh 复制代码
#!import "./shared/script/tools.ps1"

导入 JS 脚本

javascript 复制代码
#!import "./shared/script/tools.js"

导入 html

csharp 复制代码
#!import "./shared/script/tools.html"

.NET Projects

目前不支持在.NET项目上下文中导入或引用完整的.NET项目或源文件。如果你在.NET项目中有想要在笔记本中使用的功能,你可以先编译它,然后使用#r '/path/to/assembly.dll'直接引用程序集,或者将其打包并使用#r nuget引用NuGet包。

不过,正在考虑改进与.NET项目的集成。

相关推荐
岑梓铭1 小时前
考研408《计算机组成原理》复习笔记,第五章(3)——CPU的【数据通路】
笔记·考研·408·计算机组成原理·计组
Blossom.1187 小时前
把 AI 推理塞进「 8 位 MCU 」——0.5 KB RAM 跑通关键词唤醒的魔幻之旅
人工智能·笔记·单片机·嵌入式硬件·深度学习·机器学习·搜索引擎
草莓熊Lotso8 小时前
《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
c语言·开发语言·c++·笔记·其他
玖別ԅ(¯﹃¯ԅ)9 小时前
PID学习笔记6-倒立摆的实现
笔记·stm32·单片机
想学全栈的菜鸟阿董10 小时前
Django5个人笔记
笔记
ZZHow102416 小时前
JavaWeb开发_Day05
java·笔记·web
饕餮争锋18 小时前
设计模式笔记_行为型_观察者模式
笔记·观察者模式·设计模式
I'm a winner19 小时前
新手入门Makefile:FPGA项目实战教程(二)
笔记·fpga开发
汤姆大聪明21 小时前
【软件设计模式】前置知识类图、七大原则(精简笔记版)
笔记·设计模式
lingggggaaaa1 天前
小迪安全v2023学习笔记(六十一讲)—— 持续更新中
笔记·学习·安全·web安全·网络安全·反序列化