{
"cells": [
{
"cell_type": "markdown",
"id": "065bfcac",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"source": [
"使用导入魔法命令 `#!import`\n",
"========================="
]
},
{
"cell_type": "markdown",
"id": "57caa135",
"metadata": {},
"source": [
"笔记本中中,可以管理和使用nuget包,非常方便。\n",
"\n",
"但只使用Nuget包,远远不够。还可以在不将其复制到笔记本的情况下,引用其它笔记、脚本文件(C#、F#、Powershell、Python等语言脚本)、C#编译后的Dll类文件等,并且在后续代码中使用引用执行后的结果。\n",
"\n",
"#!import 魔法命令提供了这一功能。运行时,#!import 命令会从指定路径读取文件,并立即执行其中的代码。对于包含多个单元格的导入笔记本文件,这些单元格将按照它们在文件中出现的顺序运行。"
]
},
{
"cell_type": "markdown",
"id": "1d29c29a",
"metadata": {},
"source": [
"## 支持的导入类型"
]
},
{
"cell_type": "markdown",
"id": "3b31f420",
"metadata": {},
"source": [
"由于.NET Interactive支持多种语言,#!import魔法命令可以识别多种语言。如果指定的文件是支持多种语言的格式,例如.ipynb或.dib,那么文件中的不同代码片段将使用其相应的子内核运行,只要导入的内核有对应语言的子内核。\n",
"但是#!import不仅仅限于导入其他笔记本文件,它还可以直接加载已知语言的源代码文件,包括:\n",
"| 文件扩展名 | 详情 | \n",
"| ---- | ---- | \n",
"| .cs | 通用C#(注意:这些将使用C#脚本编译器进行编译。) | \n",
"| .csx | C# 脚本 | \n",
"| .fs | 通用F# 脚本 | \n",
"| .fsx | F# 脚本 | \n",
"| .html | HTML | \n",
"| .js | JavaScript | \n",
"| .ps1 | PowerShell | "
]
},
{
"cell_type": "markdown",
"id": "b9441fa5",
"metadata": {},
"source": [
"## 导入其它笔记文件"
]
},
{
"cell_type": "markdown",
"id": "4966220f",
"metadata": {},
"source": [
"> 真实使用时,比如做教程、写项目演示文档等,都是有很多文档。有些效果要在多外文档中演示;有些脚本、Nuget包、Dll文件等在多个文档中都需要引入;有些需要做成工具类,到处使用等等。\n",
"> 这时,把公共部分提出来,放在单独的文档中编辑好效果,供其它文档引用;这样非常方便。"
]
},
{
"cell_type": "markdown",
"id": "b59e49fd",
"metadata": {},
"source": [
"### 简单导入示例:运行单元格看效果"
]
},
{
"cell_type": "markdown",
"id": "795a8e47",
"metadata": {},
"source": [
"+ 相对路径:相对当前文档目录"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"我是共享单元格,执行输出!\r\n"
]
}
],
"source": [
"#!import shared/doc/Hello.ipynb"
]
},
{
"cell_type": "markdown",
"id": "b54e59da",
"metadata": {},
"source": [
"+ 相对路径:相对当前文档目录"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"我是共享单元格,执行输出!\r\n"
]
}
],
"source": [
"#!import ./shared/doc/Hello.ipynb"
]
},
{
"cell_type": "markdown",
"id": "c90d23c7",
"metadata": {},
"source": [
"+ 绝对路径:因为路径太固定,换个位置或换台电脑,就不能执行。 可使用下面的动态导入"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"我是共享单元格,执行输出!\r\n"
]
}
],
"source": [
"//执行很可能报错,看下面 \"动态导入\"\n",
"#!import \"C:\\Users\\ruyu\\Desktop\\多语言笔记学习\\Docs\\shared\\doc\\Hello.ipynb\""
]
},
{
"cell_type": "markdown",
"id": "af4bb3da",
"metadata": {},
"source": [
"### 动态导入(高级导入)\n",
"使用绝对路径时,可移置性就太差啦!或者 需要导入10个或不确定的多个文件,那就很繁琐甚至无法完成。我总结了一个高级的动态用法。"
]
},
{
"cell_type": "markdown",
"id": "a28524d7",
"metadata": {},
"source": [
"+ 示例1:利用C#程序,多次执行导入"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "c0d8919d",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"我是共享单元格,执行输出!\n",
"我是共享单元格,执行输出!\n",
"我是共享单元格,执行输出!\n"
]
}
],
"source": [
"using Microsoft.DotNet.Interactive;\n",
"using Microsoft.DotNet.Interactive.Commands;\n",
"{ //动态执行:多次执行\n",
"\n",
" for(int i=0; i<3; i++)\n",
" {\n",
" await Kernel.Root.SendAsync(new SubmitCode( $\"#!import ./shared/doc/Hello.ipynb\", \"csharp\"));\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "a8f27dff",
"metadata": {},
"source": [
"+ 示例2:利用C#程序,灵活设置各种目录"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"我是共享单元格,执行输出!\r\n"
]
}
],
"source": [
"using Microsoft.DotNet.Interactive;\n",
"using Microsoft.DotNet.Interactive.Commands;\n",
"{ //动态执行:绝对路径(当前目录转换为绝对目录,增加可移置性与灵活性)\n",
"\n",
" string currentDic = Environment.CurrentDirectory;\n",
" string fullPath = System.IO.Path.Combine(currentDic,\"shared/doc/Hello.ipynb\");\n",
"\n",
" await Kernel.Root.SendAsync(new SubmitCode( $\"#!import {fullPath}\", \"csharp\"));\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "210c65fd",
"metadata": {},
"source": [
"### 综合应用"
]
},
{
"cell_type": "markdown",
"id": "e75722d9",
"metadata": {},
"source": [
"创建一个 `初始化文档` ini.ipynb, 统一放置:公用nuget包引用、公用命名空间引用、公共对象、公用方法与共享变量等,供其它文档统一引用进行初始化。"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/markdown": [
"\n",
"[comment]: <公用初始化文档>\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#!import \"./shared/doc/Ini.ipynb\""
]
},
{
"cell_type": "markdown",
"id": "f0a05dcd",
"metadata": {},
"source": [
"+ 使用导入文档中引用 nuget 包及引用的命名空间"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\"Name\":\"张三\",\"Age\":52}\n",
"{\"Name\":\"张三\",\"Age\":52}\n"
]
}
],
"source": [
"//使用 Newtonsoft.Json\n",
"var person = new {Name = \"张三\", Age = 52};\n",
"\n",
"//没有引用命名空间要写全\n",
"var jsonText1 = Newtonsoft.Json.JsonConvert.SerializeObject(person);\n",
"Console.WriteLine(jsonText1);\n",
"\n",
"//初始化文档中引入了之后\n",
"var jsonText2 = JsonConvert.SerializeObject(person);\n",
"\n",
"Console.WriteLine(jsonText2);"
]
},
{
"cell_type": "markdown",
"id": "ffa1029f",
"metadata": {},
"source": [
"+ 使用导入文档中的公用类"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"Submission#34+Student
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Student student = new Student(){Id=2, Name = \"王安全\", Age = 12};\n",
"student.Display();"
]
},
{
"cell_type": "markdown",
"id": "5839519f",
"metadata": {},
"source": [
"+ 用导入文档中的公用变量"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"Submission#34+Student
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"SharedStudent.Display();"
]
},
{
"cell_type": "markdown",
"id": "3e67c5fe",
"metadata": {},
"source": [
"+ 使用导入文档中的公用方法(静态方法做工具类)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/plain": [
"学生信息 学号:1, 姓名:班长, 年龄:25"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"var s = StudentToString(SharedStudent);\n",
"s.Display();"
]
},
{
"cell_type": "markdown",
"id": "1f919754",
"metadata": {},
"source": [
"## 导入 C# 脚本"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [],
"source": [
"#!import \"./shared/script/tools.cs\""
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/plain": [
"c:\\Users\\ruyu\\Desktop\\多语言笔记学习\\Docs"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"//作用C#脚本功能\n",
"var callTools = Tools.GetCurrentPath();\n",
"callTools.Display();"
]
},
{
"cell_type": "markdown",
"id": "43de23d5",
"metadata": {},
"source": [
"## 导入 PowerShell 脚本"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"polyglot_notebook": {
"kernelName": "pwsh"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" Directory: C:\\Users\\ruyu\\Desktop\\多语言笔记学习\\Docs\n",
"\n",
"\u001b[32;1mMode \u001b[0m\u001b[32;1m LastWriteTime\u001b[0m \u001b[32;1;3m Length\u001b[0m\u001b[32;1m Name\u001b[0m\n",
"\u001b[32;1m---- \u001b[0m \u001b[32;1m -------------\u001b[0m \u001b[32;1m ------\u001b[0m \u001b[32;1m----\u001b[0m\n",
"d---- 2025/4/23 11:48 \u001b[44;1m.vscode\u001b[0m\n",
"d---- 2025/4/23 11:55 \u001b[44;1massets\u001b[0m\n",
"d---- 2025/4/23 11:56 \u001b[44;1mshared\u001b[0m\n",
"d---- 2025/4/23 7:31 \u001b[44;1mWebSite\u001b[0m\n",
"-a--- 2025/4/17 16:28 3678 安装与配置-Jupyter Notebook.md\n",
"-a--- 2025/4/17 16:03 2130 安装与配置-Polyglot Notebooks.md\n",
"-a--- 2025/4/23 8:51 747 多语言笔记.0.导航目录.ipynb\n",
"-a--- 2023/5/27 11:42 7998 多语言笔记.1.0.1概述与入门.ipynb\n",
"-a--- 2023/5/27 11:42 3364 多语言笔记.1.0.2常见问题.ipynb\n",
"-a--- 2025/4/20 18:17 10351 多语言笔记.1.1.入门说明.ipynb\n",
"-a--- 2025/4/23 10:11 3493 多语言笔记.1.1.入门说明.md\n",
"-a--- 2025/4/23 9:58 583 多语言笔记.1.2.魔法命令.ipynb\n",
"-a--- 2025/4/21 8:46 9546 多语言笔记.1.2.显示程序执行结果.ipynb\n",
"-a--- 2025/4/17 3:04 55558 多语言笔记.1.2.显示格式化.ipynb\n",
"-a--- 2025/4/17 15:41 9043 多语言笔记.1.2.PocketView渲染html.ipynb\n",
"-a--- 2023/5/27 11:42 3079 多语言笔记.1.3.多语言.ipynb\n",
"-a--- 2025/4/23 10:17 7606 多语言笔记.1.4.1.管理 NuGet包.ipynb\n",
"-a--- 2025/4/23 13:54 11593 多语言笔记.1.4.2.使用 导入命令.ipynb\n",
"-a--- 2025/4/23 9:48 981 多语言笔记.10.1.其它客户端.ipynb\n",
"-a--- 2025/4/20 18:12 2873 多语言笔记.100.1.测试.ipynb\n",
"-a--- 2025/4/23 9:58 83014 多语言笔记.2.1.操作数据库-SQL内核.ipynb\n",
"-a--- 2025/4/18 19:45 60535 多语言笔记.2.2.操作数据库-C#.ipynb\n",
"-a--- 2025/4/21 8:59 327901 多语言笔记.200.工具.ipynb\n",
"-a--- 2025/4/5 12:42 2089 多语言笔记.3.1.交互式 Razor.ipynb\n",
"-a--- 2025/4/5 13:10 13599 多语言笔记.3.2.交互式 Blazor.ipynb\n",
"-a--- 2025/4/23 9:55 1374 多语言笔记.300.技巧与总结.ipynb\n",
"-a--- 2024/5/26 2:54 62771 多语言笔记.4.1.使用 WebApi.ipynb\n",
"-a--- 2024/5/26 2:54 7979 多语言笔记.5.1.使用扩展库.ipynb\n",
"-a--- 2025/4/23 10:11 4516 多语言笔记.6.1.共享变量.ipynb\n",
"-a--- 2025/4/19 21:14 4031 多语言笔记.7.1.运行xUnit单元测试.ipynb\n",
"-a--- 2025/4/19 21:14 4451 多语言笔记.8.1.运行Benchmark基准测试.ipynb\n",
"-a--- 2025/4/23 9:51 11172 多语言笔记.9.1.使用 html.ipynb\n",
"-a--- 2025/4/20 18:19 6435 多语言笔记.9.2.使用 python内核.ipynb\n",
"-a--- 2025/4/23 9:51 981 多语言笔记.9.3.扩展 NET Interactive.ipynb\n",
"-a--- 2025/4/15 18:13 6915 Base.ipynb\n",
"-a--- 2025/4/15 18:44 455 config.json\n",
"\n"
]
}
],
"source": [
"#!import \"./shared/script/tools.ps1\""
]
},
{
"cell_type": "markdown",
"id": "6c4403c1",
"metadata": {},
"source": [
"## 导入 JS 脚本"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"polyglot_notebook": {
"kernelName": "javascript"
}
},
"outputs": [
{
"data": {
"text/plain": [
"我是来自js脚本的信息"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#!import \"./shared/script/tools.js\""
]
},
{
"cell_type": "markdown",
"id": "f4a40f9f",
"metadata": {},
"source": [
"## 导入 html"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [
{
"data": {
"text/html": [
"\r\n",
"\r\n",
"\r\n",
" \r\n",
" \r\n",
" Html文档\r\n",
"\r\n",
"\r\n",
" \r\n",
"
我是一级标题
\r\n",
" 我是二级标题
\r\n",
" \r\n",
"\r\n",
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#!import \"./shared/script/tools.html\""
]
},
{
"cell_type": "markdown",
"id": "f7bccfcd",
"metadata": {},
"source": [
"## .NET Projects"
]
},
{
"cell_type": "markdown",
"id": "68d52fc4",
"metadata": {},
"source": [
"目前不支持在.NET项目上下文中导入或引用完整的.NET项目或源文件。如果你在.NET项目中有想要在笔记本中使用的功能,你可以先编译它,然后使用#r '/path/to/assembly.dll'直接引用程序集,或者将其打包并使用#r nuget引用NuGet包。\n",
"不过,正在考虑改进与.NET项目的集成。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
"name": ".net-csharp"
},
"polyglot_notebook": {
"kernelInfo": {
"defaultKernelName": "csharp",
"items": [
{
"aliases": [],
"languageName": "csharp",
"name": "csharp"
}
]
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}