动态编译库 Natasha 5.0 兼容版本发布( 二 )


  • 输出环境 : 若您觉得生成文件中有较多的多语言适配, 可以使用 <SatelliteResourceLanguages>en</SatelliteResourceLanguages> 来指定默认的资源语言.
  • 二义性错误 : 该问题仍然被归属到用户的错误编程行为中, 并不该由 IDE 或 Natasha 自动解决, 我仍倾向于在命名空间发生冲突时由用户手动改解决该问题, 上下文语义环境不能百分百推测出用户想使用某个命名空间.目前推荐的三种方法:
    • 使用 Natasha.CSharp.Extension.Ambiguity 扩展包及 .Using()/.ConfigUsing() 模板自带的方法指定优先级最高的 Using. (该包将在不久后以独立项目存在,它并不属于 Natasha 项目, 晚于 Natasha5.0 发布)
    • 直接使用引擎 AssemblyCSharpBuilder 编译字符串, 在字符串层面替换.
    • 自写语义过滤方法, 更新编译单元中的语法树, 使用 Natasha 的语义扩展方法来添加您的过滤方法assemblyCSharpBuilder.AddSemanticAnalysistor(Func<AssemblyCSharpBuilder, CSharpCompilation, CSharpCompilation>) (需要有语法语义相关编程经验).
  • 案例一个尽可能复杂的案例:
    var action = NDelegate//使用随机域 也可以使用 CreateDomain / UseDomain / DefaultDomain//Core3.1以下仅能使用 DefaultDomain.DefaultDomain()//[可选API] 必要时使用 ConfigBuilder 配置编译单元(下面只为展示API, 有需求就用, 没需求不用写).ConfigBuilder(builder => builder//配置编译器选项 .ConfigCompilerOption(opt => opt//配置平台.SetPlatform(Microsoft.CodeAnalysis.Platform.AnyCpu)//Release 方式编译.CompileAsRelease()//开启可空警告.SetNullableCompile(Microsoft.CodeAnalysis.NullableContextOptions.Warnings))//配置语法选项 .ConfigSyntaxOptions(opt => opt//配置支持的脚本语言版本.WithLanguageVersion(Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8))//禁用语义检查与过滤 .DisableSemanticCheck()) //[可选API] 配置该方法所在的类模板.ConfigClass(item => item//给类配置一个名字,不用随即名.Name("myClass")//不使用默认域的 Using 缓存.NoGlobalUsing()) //[可选API] 为类模板添加 using 引用.ConfigUsing("System") //这里的 API 参照定义的委托, 包括委托的参数 //例如 Action<int> / Func<int,int> 拥有一个参数, 参数的名字请在 Action<int> / Func<int,int> 上 F12 查看定义获取参数名..Action("Console.WriteLine(\"Hello World!\");");action(); /*Output: Hello World!*/更多案例 更多文档
    更新日志
    • 2022/09/05 - 2022/09/21
      • 分离引擎, 项目分为多域和单域, 以部分类方式合并 API.
      • 使用 IndexOf 替代 Contans 方法做兼容.
      • 支持 netstandard2.0 及 coreapp3.1,net5.0,net6.0 版本.
      • 升级 DotNetCore.SourceLink.Environment 依赖以支持 netstandard2.0/1 版本.
      • 升级 DotNetCore.Compile.Environment 依赖以支持 netstandard2.0/1 版本.
    • 2022/09/30 - 2022/10/09
      • 使用 Assembly.ReflectionOnlyLoad 替代 MetadataLoadContext 解决单域引擎只读元数据的问题.
      • 优化单域引擎初始化过程中扫描源dll文件的问题.

    经验总结扩展阅读