@@ -17,46 +17,6 @@ sidebar_position: 2
17
17
18
18
Roslyn 的出现让我看到了生态百花齐放的希望,它让 Emit 变得透明,并允许我们使用 C# 代码进行动态编译。这是王道啊,兄弟们,这是新时代的大彩之道啊。这套方案无异于鸟枪换炮,有人可能会比较在意官方的态度,这里可以说,官方是推荐这么做的,只不过你能不能驾驭得了的问题,这项技术带来的成本是引用依赖、错误处理、分域加载等问题。经一系列的调研、整理、测试之后,Natasha 已解决上述问题并于 2019 年正式面向大众,目前 Natasha 在 netcore/net5 版本中发布了稳定版,在这两年的发展中,我们从整合到解耦,从中规中矩到新科技应用,Natasha 正在走一个由 无 ——> 有 ——> 整 ——> 精 ——> 轻 的路线。接下来我将结合示例详细讲解 Natasha 的应用.
19
19
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
-
60
20
## 简单应用场景
61
21
62
22
到此我们学习了如何使用 Natasha 构建类, 我们可以尝试自己完成一些简单场景, 比如实现一个 AOP 代理类, 如果你对 AOP 代理类有足够的了解, 我相信 5 分钟即可有小成.
0 commit comments