master
bicijinlian 4 weeks ago
parent 848a4237b5
commit 96c360e039

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

@ -1,184 +0,0 @@
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# 同一笔记中使用多语言"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## C# 例子"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"var student = new {Id=1, Name=\"张三\",Age=18};\n",
"student.Display();"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## F# 例子"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "fsharp"
},
"polyglot_notebook": {
"kernelName": "fsharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"printfn \"Hello World from F#\""
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Powershell 例子"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "pwsh"
},
"polyglot_notebook": {
"kernelName": "pwsh"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": [
"#! powershell\n",
"Write-Host \"hellow powershell\""
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 html"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 JavaScript"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 SQL"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 KQL"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 mermaind"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 Raw Value Storage"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## 使用 Rarzor"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"dotnet_interactive": {
"language": "value"
},
"polyglot_notebook": {
"kernelName": "value"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## HTTP Request"
]
}
],
"metadata": {
"language_info": {
"name": "python"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,314 @@
# 混合使用多语言并共享变量
混合使用多种语言(C#、F#、Powershell、SQL、KQL、Python、Html、JavaScript、JavaScript、Mermaind等语言),是多语言笔记的最大特性,并且支持各语言之间共享变量这一创新功能。
## 语言及共享变量的支持情况
| 语言 | 变量共享 |
| ---- | ---- |
| C# | 支持 |
| F# | 支持 |
| PowerShell | 支持 |
| JavaScript | 支持 |
| SQL | 支持 |
| KQL | 支持 |
| Python | 支持 |
| R | 支持 |
| HTML | 不支持 |
| Mermaid | 不支持 |
## 初始化
```C#
//全局初始化
#!import "./Base.ipynb"
//共享
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
```
## 使用 SQL(SQLite为例)
+ 引用NuGet包
```C#
#r "nuget:Microsoft.DotNet.Interactive.SQLite,*-*"
```
+ 连接 SQL内核(使用 `#!connect` 魔法命令)
```C#
/* 简单使用
#!connect sqlite --kernel-name SQLiteSharedKernel --connection-string "Data Source=.\assets\database\study.db;"
*/
//优化方法
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
{
//内核名:魔法命令中的内核名,执行后会自动加 sql- 前缀,做为内核名被使用
string magicCommandKernelName = "SQLiteSharedKernel";
string completeKernelName = "sql-" + magicCommandKernelName;
//引入内核:可重复执行
if(Microsoft.DotNet.Interactive.Kernel.Root.FindKernelByName(completeKernelName) == null)
{
var connectKernelCode = $"#!connect sqlite --kernel-name {magicCommandKernelName} --connection-string \"{SharedDbConnect.SQLiteConnectionString}\"";
await Kernel.Root.SendAsync(new SubmitCode( connectKernelCode, "csharp"));
}
else
{
Console.WriteLine($"名为 {completeKernelName} 的内核已存在。需要新内核时,请为--kernel-name参数使用不同的值, 本次执行不做任何更改!");
}
}
```
+ 使用SQL内核(SQL语句操作数据库)
```C#
#!sql-SQLiteSharedKernel
--查询年龄最大的5名学生
SELECT * FROM Student order by Age Desc LIMIT 5;
--查询学生总数
SELECT COUNT(*) AS Count FROM Student;
```
## 使用 KQL(效果图)
因为环境比较难搭建,用效果图代替。
![KQL效果](./assets/images/KQL_Samples.jpg)
## 使用 Raw Value Storage
使用value内核可以方便的管理共享文本数据。
```C#
#!value --name SharedDataFromValueKernel --from-file ./shared/file/data.json
```
## C#
### 一般使用
```C#
var student = new {Id=1, Name="张三",Age=18};
student.Display();
```
### 使用Value内核共享的变量
```C#
#!set --name fromSharedFileData --value @value:SharedDataFromValueKernel
fromSharedFileData.Display();
```
### 共享变量
使用C#查询数据库中的数据,共享出来,给其它语言(F#、html、js等使用)
```C#
#r "nuget:Microsoft.Data.SqlClient"
#r "nuget:Microsoft.Data.Sqlite"
using System.Data;
using System.Data.Common;
using System.Data.SqlTypes;
using Microsoft.Data.SqlClient;
using Microsoft.Data.Sqlite;
//使用 Ado.Net 从SQLite中获取数据再共享出去
//查询数据
var SharedStudents = new List<Student>();
{
DataSet ds = new DataSet();
using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString))
{
sqlConnection.Open();
var querySql =
"""
SELECT * FROM Student LIMIT 5;
""";
var cmd = sqlConnection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = querySql;
using (var reader = await cmd.ExecuteReaderAsync())
{
//循环输出行数据
while (await reader.ReadAsync())
{
var user = new Student()
{
Id = reader.GetFieldValue<int>("Id"),
Name = reader.GetFieldValue<string>("Name"),
Age = reader.GetFieldValue<int>("Age"),
};
SharedStudents.Add(user);
}
}
sqlConnection.Close();
sqlConnection.Dispose();
}
}
//共享数据:默认SharedStudents已共享其它语言引用即可
SharedStudents.Display();
```
## F#
### 简单示例
```C#
printfn "Hello World from F#"
```
### 使用C#共享数据
```C#
#!set --value @csharp:SharedStudents --name SharedStudents
SharedStudents
```
## Powershell
```C#
#!powershell
Write-Host "hellow powershell"
```
## 使用Python
+ 前提系统要安装Python环境推荐使用Anaconda安装直接安装Python也可以
+ 作用:使多语言笔记,直接支持 Python语言
+ 连接到 Python 内核
```C#
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
//引入Python内核使用C# 执行引入语句
if(Kernel.Root.FindKernelByName("pythonkernel2") == null)
{
//Console.WriteLine("正在导入Python内核....");
var importPythonkernel = "#!connect jupyter --kernel-name pythonkernel2 --kernel-spec python3";
await Kernel.Root.SendAsync(new SubmitCode( importPythonkernel, "csharp"));
Console.WriteLine("Python内核导入完成");
}
else
{
Console.WriteLine("Python内核已经导入");
}
```
+ 使用 Python
```C#
# 明确指定内核:优先级高于 "单元格选择的内核"
#!pythonkernel2
#!set --value @csharp:SharedStudents --name SharedStudents
print("你好,我是 Ployglot Notebooks 使用 Python语言内核打印的内容")
```
## 在 Python 中使用C#共享变量
```C#
#!pythonkernel2
#!set --value @csharp:SharedStudents --name SharedStudents
print(SharedStudents)
```
## 使用 html
```C#
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>完整html文档</title>
</head>
<body>
<div style="color:green">
<h2 id="MyTitle">使用Html文档当然也可以使用Html片断。注意纯HTML不支持共享变量</h2>
<table id="student" border="1" style="color:#fff">
<caption>C#共享数据:学生表</caption>
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</body>
</html>
```
## 使用 JavaScript
+ 简单使用
```C#
console.log("输出js日志");
```
+ 操作html
```C#
//改变上面html中h2文本颜色执行后上面看效果
document.getElementById("MyTitle").style.color = "red";
```
+ 使用C#共享数据,填充数据表格
```C#
#!set --value @csharp:SharedStudents --name SharedStudentsInJs
// 获取表格的tbody部分
const tableBody = document.querySelector('#student tbody');
// 遍历数据数组
SharedStudentsInJs.forEach(item => {
// 创建一行
const row = document.createElement('tr');
// 创建单元格并填入数据
const nameCell = document.createElement('td');
nameCell.textContent = item.Id;
row.appendChild(nameCell);
const ageCell = document.createElement('td');
ageCell.textContent = item.Name;
row.appendChild(ageCell);
const jobCell = document.createElement('td');
jobCell.textContent = item.Age;
row.appendChild(jobCell);
// 将该行添加到表格的tbody中
tableBody.appendChild(row);
});
```
## HTTP Request
## 基本请求
```C#
### 请求 京东
get https://www.jd.com
### 请求QQ
get https://www.qq.com
```
+ 高级请求(使用变量等)
```C#
@host=https://www.qq.com
get {{host}}
```
## 使用 mermaind
```C#
stateDiagram-v2
[*] --> Active
state Active {
[*] --> NumLockOff
NumLockOff --> NumLockOn : EvNumLockPressed
NumLockOn --> NumLockOff : EvNumLockPressed
--
[*] --> CapsLockOff
CapsLockOff --> CapsLockOn : EvCapsLockPressed
CapsLockOn --> CapsLockOff : EvCapsLockPressed
--
[*] --> ScrollLockOff
ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
}
```
```C#
stateDiagram-v2
state fork_state <<fork>>
[*] --> fork_state
fork_state --> State2
fork_state --> State3
state join_state <<join>>
State2 --> join_state
State3 --> join_state
join_state --> State4
State4 --> [*]
```

@ -1,56 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "8b314faa",
"metadata": {},
"source": [
"除VS Code外.NET Interactive 还有其它几种客户端UI和交互方式\n",
"========================================================="
]
},
{
"cell_type": "markdown",
"id": "1dcfeba1",
"metadata": {},
"source": [
"+ REPL 交互式命令行\n",
"+ UI\n",
"+ UI2"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "516a4839",
"metadata": {
"polyglot_notebook": {
"kernelName": "csharp"
}
},
"outputs": [],
"source": []
}
],
"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
}

@ -0,0 +1,193 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "8b314faa",
"metadata": {},
"source": [
".NET Interactive 使用方式\n",
"========================"
]
},
{
"cell_type": "markdown",
"id": "6bf06d6d",
"metadata": {},
"source": [
".NET Interactive生态大约由前端UI(Jupyter、VSCode等)、交互协议(PMP、JMP)、执行器(.net interactive)和语言服务组成。\n",
"\n",
"![生态](./assets/images/Framework.png)\n",
"\n",
"有多种组合方式,来使用。最常用的还是 VS Code(Polyglot Notebooks插件)充当前端UI调用 .net interactive 执行器。"
]
},
{
"cell_type": "markdown",
"id": "0bd5f553",
"metadata": {},
"source": [
"## `VS Code` 配合 `Polyglot Notebooks`插件"
]
},
{
"cell_type": "markdown",
"id": "aacf21bd",
"metadata": {},
"source": [
"这是最常用的、功能最丰富的使用方式。\n",
"\n",
"![VS Code UI](./assets/images/使用方式-VSCode.jpg)"
]
},
{
"cell_type": "markdown",
"id": "a4483f2d",
"metadata": {},
"source": [
"## 使用为 `Jupyter kernel`"
]
},
{
"cell_type": "markdown",
"id": "267be322",
"metadata": {},
"source": [
"通过设置Jupyter服务(把.net interactive安装成Jupyte插件),使用 Jupyter笔记本直接支持C#、F#、Powershell语言。\n",
"\n",
"![Jupyter](./assets/images/使用方式-Jupyter1.jpg)\n",
"\n",
"![Jupyter](./assets/images/使用方式-Jupyter2.jpg)"
]
},
{
"cell_type": "markdown",
"id": "9174543b",
"metadata": {},
"source": [
"## nteract 简单UI客户端"
]
},
{
"cell_type": "markdown",
"id": "3efc71a3",
"metadata": {},
"source": [
"[nteract](https://nteract.io/) 是另一个可视化UI应用。并且提供了 CoreSdk开发库能在应用中直接使用 .net interactive 库。\n",
"\n",
"下载,安装后,直接使用。官网 https://nteract.io\n",
"\n",
"![nteract](./assets/images/使用方式-nteract.jpg)\n"
]
},
{
"cell_type": "markdown",
"id": "e613e55b",
"metadata": {},
"source": [
"## `dotnet-repl` 交互式命令行"
]
},
{
"cell_type": "markdown",
"id": "2505ac35",
"metadata": {},
"source": [
"[dotnet-repl](https://github.com/jonsequitur/dotnet-repl) 项目是一个实验项目,使用 .NET Interactive / Polyglot Notebooks 和 Spectre.Console 创建多语言 .NET REPL 以在命令行上使用。\n",
"\n",
"实质上是一个 .net tool\n",
"\n",
"[官网](https://github.com/jonsequitur/dotnet-repl)"
]
},
{
"cell_type": "markdown",
"id": "68afc987",
"metadata": {},
"source": [
"+ 安装"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"polyglot_notebook": {
"kernelName": "pwsh"
}
},
"outputs": [],
"source": [
"dotnet tool install -g dotnet-repl"
]
},
{
"cell_type": "markdown",
"id": "69aceca8",
"metadata": {},
"source": [
"+ 单行命令"
]
},
{
"cell_type": "markdown",
"id": "12770923",
"metadata": {},
"source": [
"![REPL](./assets/images/使用方式-REPL-1.jpg)"
]
},
{
"cell_type": "markdown",
"id": "1a91a9af",
"metadata": {},
"source": [
"+ 多行命令"
]
},
{
"cell_type": "markdown",
"id": "85d29f2f",
"metadata": {},
"source": [
"![REPL](./assets/images/使用方式-REPL-2.jpg)"
]
},
{
"cell_type": "markdown",
"id": "bbae9984",
"metadata": {},
"source": [
"+ 执行笔记本文件"
]
},
{
"cell_type": "markdown",
"id": "6cdaf093",
"metadata": {},
"source": [
"![REPL](./assets/images/使用方式-REPL-3.jpg)"
]
}
],
"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
}

@ -1,26 +0,0 @@
# 使用 Razor 进行交互式展示
## 添加 Nuget 包
```csharp
// 可以先添加包源
#r "nuget: RazorInteractive"
```
## 添加引用
```csharp
#!razor
```
## 示例
```razor
#!razor
@{
var colors = new [] { "red", "green", "blue" };
}
<ol>
@foreach(var color in colors)
{
<li style="color: @color;">@color</li>
}
</ol>
```

@ -0,0 +1,71 @@
# 使用 扩展库 Microsoft.DotNet.Interactive.ExtensionLab
## 添加 Nuget 包, 成功后有用法摘要提示
```csharp
// 可以先添加包源
#i "nuget:https://api.nuget.org/v3/index.json"
//添加 Nuget 包
#r "nuget: Microsoft.DotNet.Interactive.ExtensionLab,*-*"
```
## 使用 #!linqify 创建强类型的 数据帧
#!linqify magic命令将 Microsoft.Data.Analysis.DataFrame 变量替换为生成的强类型数据帧从而允许对包含的数据使用LINQ操作。
```csharp
#!linqify frame --show-code
```
## ExplainCode
这个扩展使用 Mermaid 内核从 csharp 代码生成序列图
## 使用 #!inspect 命令,检查代码编译详细信息!
#!inspect 命令,允许您查看C#单元格代码的反编译、IL和JIT Asm. 注意深色模式下展示区顶部的Tab[C# | IL JIT | ASM]不明显但可以正常点击切换或者换个VSCode主题。
```csharp
#!inspect
foreach(var x in Enumerable.Range(1,10))
{
Console.WriteLine(x);
}
```
## 使用 #!record命令来保存您运行的代码的副本
一旦您使用 #!recore 启用转录本记录每个代码提交包括重新运行的单元格都记录在指定的文件中。所使用的JSON格式与.NET Interactive stdio和http API识别的格式相同可用于通过自动化回放交互式会话。
```csharp
#!record --output recore.json
//会在笔记所在的目录生成 recore.json 文件
```
```csharp
Console.WriteLine("#!record");
```
## 查询 SQLite 数据库
此扩展添加了对使用 #!connect sqlite 命令连接到SQLite数据库的支持有关详细信息请使用 #!sql 魔术命令。
```sql
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=SQLiteDemo.db"
/*
相对目录位置
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=Database\SQLiteDemo.db;"
缓存共享
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=Database\SQLiteDemo.db;Cache=Shared;"
使用带密码
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=SQLiteDemo.db;Cache=Shared;Password=MyEncryptionKey;"
只读模式
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=SQLiteDemo.db;Mode=ReadOnly"
读写创建模式
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=SQLiteDemo.db;Mode=ReadWriteCreate"
读写模式
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=SQLiteDemo.db;Mode=ReadWrite"
私有内存模式
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=:memory:"
共享内存模式
#!connect sqlite --kernel-name MySQLiteDemo "Data Source=Sharable;Mode=Memory;Cache=Shared"
*/
```
```sql-MySQLiteDemo
#!sql-MySQLiteDemo
select * from person;
```

@ -0,0 +1,209 @@
在笔记中共享数据(变量)
====================
使用 .NET 交互式内核,可以在单个笔记本中以多种语言编写代码。为了利用每种语言的不同优势,您会发现在它们之间共享数据很有用。即一种语言的变量,可以在其它语言中使用。
默认情况下,.NET Interactive 支持多种不同的语言其中大多数语言都允许使用magic 命令`#!set` 和 `#!shared` 进行共享。
## 变量共享的语言支持情况
| 语言 | 变量共享 |
| ---- | ---- |
| C# | 支持 |
| F# | 支持 |
| PowerShell | 支持 |
| JavaScript | 支持 |
| SQL | 支持 |
| KQL | 支持 |
| Python | 支持 |
| R | 支持 |
| HTML | 不支持 |
| Mermaid | 不支持 |
## 同种内核 默认共享数据
同种内核的不同单元格之间,无需任何操作,变量默认共享,后续单元格直接使用前面已执行单元格的数据。
+ JS 各单元格共享示例:
```javascript
//声明变量
JsShared = "jsShared";
```
```javascript
//直接使用上面单元格变量
console.log(JsShared);
```
+ C# 各单元格共享示例:
```csharp
//声明变量
string CsharpShared = "CsharpShared";
```
```csharp
//直接使用
Console.WriteLine(CsharpShared);
```
## 使用 `#!set``#!shared` 魔法命令共享数据
> `#!shared` 魔法命令从 .NET Interactive 的早期就已经存在,而 `#!set` 是较新的命令,它提供了` #!share` 功能的超集。由于 `#!set` 具有更丰富的功能并且更具可读性,因此就优先使用`#!set`。
> 把 `#!share` 命令重写为 `#!set` 命令很容易
`#!share` 用法的示例:
```javascript
//声明一个要被共享的js变量
//共享的变量声明不要加var、let、const关键字,加了变局部变量
jsVar = "js变量值";
#!share --from javascript jsVar --as csVarFromJs22222
```
```csharp
//共享变量
#!share --from javascript jsVar --as csVarFromJs
Console.WriteLine(csVarFromJs);
```
改写为 等价的 `#!set` 命令:
```csharp
#!set --name csVarFromJs --value @javascript:jsVar
Console.WriteLine(csVarFromJs);
```
`#!share`命令通过 --from 选项,声明了共享数据来源,通过 --as 选项 声明共享变量的新名称,方便后续使用;
`#!set`命令通过更加明确的选项 `--name``--value` 选项, 指明了共享数据的值(形如:@来源:值形)和新名称;
## 变量视图:管理变量
![变量共享](./assets/images/shared.001.jpg)
## 内核之间共享数据
示例C# 运行中的变量,被其它语言共享。
```csharp
//定义变量:存储网关
string getway = "192.168.1.1";
```
+ PowerShell 中使用
```pwsh
# Poweshell中使用 前面C#单元中定义的变量
# 特别注意因为PS中变量名必须以$开头,所以在命令中 name 参数名在PS中使用时必须加$前辍
#!set --value @csharp:getway --name gw
Write-Host $gw
```
+ F# 中使用
```fsharp
#!set --value @csharp:getway --name getway
Console.WriteLine(getway)
```
+ 在javascrip中使用
```javascript
#!set --value @csharp:getway --name getway
console.log(getway);
```
## 从用户输入中设置变量
共享数据变量的值,不但能直接设置、来自其它变量,还可以是由用户输入的。这在需要用户交互时,非常有用,比如:需要用户输入密码、流程控制由用户选择等。
注意执行后会在VS Code顶部弹出一个小的用户输入窗口用户输入内容并且确认后用户的输入内容会被存储为变量的值.
可以在魔法命令中使用一个@input前缀直接从用户输入中设置一个值。比如
```csharp
#!set --name userName --value @input("请输入姓名");
Console.WriteLine($"输入的姓名是:{userName}")
```
如果希望用户输入在UI中被遮盖(比如不希望在屏幕上显示的秘密),可以使用@password前缀来代替@input
```csharp
#!set --name userPassword --value @password("请输入密码");
Console.WriteLine($"输入的密码是:{userPassword}");
```
通过和前缀请求用户输入的能力不仅仅局限于共享数据的魔法命令,还可以在程序中使用。比如:
```csharp
using Microsoft.DotNet.Interactive;
var input = await Kernel.GetInputAsync("Pick a number.");
Console.WriteLine($"输入为:{input}")
```
## MIME 类型
在.NET Interactive中当变量在子内核之间共享时通常需要将其转换为某种字符串表示形式。这是因为.NET Interactive中的许多子内核运行在不同的进程中。例如核心内核在其自己的.NET进程中运行而多语言笔记本扩展在VS Code进程中运行。你还可以在远程机器上运行子内核。子内核也可以在不同的平台上实现例如.NET和JavaScript。
因此,虽然在共享进程时,.NET语言之间可以通过引用共享变量但共享的主要用例涉及某种形式的序列化。序列化格式由MIME类型指定用户可以通过可选的选项来指定。如果不指定选项则默认使用text/plain MIME类型用于变量共享。
这意味着请求的变量将由源内核序列化为JSON然后可选地由目标内核进行反序列化。对于基于.NET的内核序列化使用特定的方法进行。在基于.NET的目标内核中使用的反序列化策略如下
| 源json类型 | 目标.NET类型 |
| ---- | ---- |
| boolean | System.Boolean |
| number | System.Double |
| string | System.String |
| other | System.Text.Json.JsonDocument |
将变量转换为指定的MIME类型是通过使用.NET Interactive格式化API完成的这些API可以定制。
## 引用共享
默认情况下的共享是值共享(即副本共享),在特定情况下,引用类型变量可以通过引用进行共享。但要注意:
+ 源和目标内核必须在同一进程中运行。
+ 源和目标内核必须基于公共语言运行时如C#、F#、PowerShell
+ 如果使用的是#!set--byref引用共享仅在使用该选项时启用。
+ 如果使用的是#!share--mime-type引用共享是默认行为但在使用该选项时会禁用。
因此,如果共享一个可变对象,其状态的更改将在子内核间立即可见,这与默认的基于序列化的共享不同。
```fsharp
//F# 声明数组
open System.Collections.Generic;
let messages = List<string>()
messages.Add "由F#添加"
```
```csharp
//C#获取并修改
#!set --byref --value @fsharp:messages --name msgList
msgList.Add("由C#添加");
msgList.Display();
```
```fsharp
//F#中的原数组已被C#修改
messages
```
## `#!value` 内核,直接设置值
在笔记本中使用文本是很常见的需求。这些文本可能是JSON、CSV、XML或其他格式。它们可能存在于文件中、剪贴板上或者在网页上。
为了尽可能方便地将这些文本导入到笔记本中的变量里,我们提供了`#!value`魔法命令。需要知道的重要一点是,这是一个别名,指向一个专门设计用于存储值的子内核。这意味着一旦将某些内容存储在其中,就可以通过或从另一个子内核访问它(`#!set` `#!share`)
有三种方法可以使用来将数据导入到你的笔记本会话中:
+ 剪贴板
最简单的使用方法是将一些文本粘贴到单元格中。文本将被存储为字符串但与在C#、F#或PowerShell中使用字面量不同这里不需要转义任何内容。
```value
#!value --name StudentJson
{
"Id":2,
"Name":"小李",
"Age":33
}
```
```csharp
#!set --name fromValueKernel --value @value:StudentJson
fromValueKernel.Display();
```
+ 文件
数据存储在一个文件中时,使用带有选项的命令:#!value--from-file, 获取共享数据。
```value
#!value --name fromFileData --from-file ./shared/file/data.json
```
```csharp
#!set --name fromValueFileData --value @value:fromFileData
fromValueFileData.Display();
```
+ URL
也可以使用--from-url选项从一个URL地址获取数据
```value
#!value --name fromUrlData --from-url https://www.qq.com
```
```csharp
#!set --name fromValueUrlData --value @value:fromUrlData
fromValueUrlData.Display();
```
## 指定 MIME 类型
无论使用哪种方法,都可以使用`--mime-type`选项在提交时选择在笔记本中显示值。如果笔记本前端知道如何显示mime类型可以看到它格式正确
```value
#!value --name JsonData --mime-type application/json
{
"Id":2,
"Name":"小张",
"Adress":{
"Code":"0394",
"info":"变法路36号101"
}
}
```
Loading…
Cancel
Save