Skip to content

Commit f73dff3

Browse files
committed
更新文档
1 parent b012b38 commit f73dff3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1458
-1290
lines changed

src/docs/00-1-Why.md

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,46 +17,6 @@ sidebar_position: 2
1717

1818
Roslyn 的出现让我看到了生态百花齐放的希望,它让 Emit 变得透明,并允许我们使用 C# 代码进行动态编译。这是王道啊,兄弟们,这是新时代的大彩之道啊。这套方案无异于鸟枪换炮,有人可能会比较在意官方的态度,这里可以说,官方是推荐这么做的,只不过你能不能驾驭得了的问题,这项技术带来的成本是引用依赖、错误处理、分域加载等问题。经一系列的调研、整理、测试之后,Natasha 已解决上述问题并于 2019 年正式面向大众,目前 Natasha 在 netcore/net5 版本中发布了稳定版,在这两年的发展中,我们从整合到解耦,从中规中矩到新科技应用,Natasha 正在走一个由 无 ——> 有 ——> 整 ——> 精 ——> 轻 的路线。接下来我将结合示例详细讲解 Natasha 的应用.
1919

20-
## 项目初识
21-
22-
Natasha 采用 MIT 开源协议, 并接受了实战的检验, 可以通过引用 DotNetCore.Natasha.CSharp 来使用 Natasha.
23-
24-
Natasha 最基本的编译单元是 AssemblyCSharpBuilder, 该编译单元有很多属性:
25-
26-
- CompileErrorBehavior 编译出错的行为, 默认为抛出异常;
27-
- SyntaxErrorBehavior 语法出错的行为,默认为抛出异常;
28-
- AssemblyOutputKind 程序集输出到文件或内存流;
29-
- OutputFolder 程序集输出目录, 默认为当前 APP 下的 DynamicLibraryFolders 目录;
30-
- CustomUsingShut 使用客户自定义的 using 引用;
31-
32-
在随机一个域中生成一个 Test 类
33-
34-
```cs
35-
//初始化 Natasha 编译组件及环境
36-
NatashaInitializer.Preheating();
37-
//创建编译单元,并指定程序集名
38-
AssemblyCSharpBuilder oop = new AssemblyCSharpBuilder("myAssembly");
39-
//编译单元使用从域管理分配出来的随机域
40-
oop.Domain = DomainManagement.Random();
41-
//增加代码到编译单元中
42-
oop.Add(@"namespace HelloWorld{ public class Test{ public Test(){ Name = null; } public string Name; } }");
43-
//根据短名获取程序集中的类,长名则如 "HelloWorld.Test"
44-
Type type = oop.GetTypeFromShortName("Test");
45-
```
46-
47-
以上展示了对字符串的构造, Natasha 对此提供了很多模板以简化操作比如 NClass, 以上代码可以转换为:
48-
```cs
49-
var type = NClass
50-
.RandomDomain()
51-
.Namespace("HelloWorld")
52-
.Name("Test")
53-
.Ctor(item => item.Public().Body("Name = null;"))
54-
.PublicField<string>("Name")
55-
.GetType();
56-
```
57-
58-
需要注意的是,这个程序集属于某个随即域中, 你可以使用 type.DisposeDomain() 来移除引用以便 GC 来卸载它. 主域(程序开始的域)又叫共享域, 随机域可以拿到主域中的类型及数据,随机域之间的调用是不允许的, 这个特性也让后面的插件编程大显身手.
59-
6020
## 简单应用场景
6121

6222
到此我们学习了如何使用 Natasha 构建类, 我们可以尝试自己完成一些简单场景, 比如实现一个 AOP 代理类, 如果你对 AOP 代理类有足够的了解, 我相信 5 分钟即可有小成.

src/docs/api/001-Preheating.md

Lines changed: 0 additions & 82 deletions
This file was deleted.

src/docs/api/002-Compiler.md

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/docs/api/004-static-init.md

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)