Rosyln介绍

Rosyln1 是 .NET Core和 .NET 4.6+ 中 的C# 、VB的编译器,宇宙最强IDE Visual Studio 也是使用其来编译代码的, 基于编译器也是服务的理念,微软开发者把其独立出来,并开源维护,开源地址参见注脚2。
在工作流引擎 或是规则引擎中有时候都需要一项功能是计算表达式, 以前我们通常借助于Antlr 3 ,根据特殊的语法(文法)来构建复杂的解析器代码。它就像是一个用于语言解析的加强版的正则表达式。当然你也可以采用目前流行的解释型语言引擎来完成此事,可以参考我之前的文章,有一篇有关Javascript引擎的介绍。
Rosyln 下也有一个类似的C#编译器脚本引擎 C# Scripting API 4 ,来完成 类似下面的表达式评估。
安装包 * Microsoft.CodeAnalysis.CSharp.Scripting*

int result = await CSharpScript.EvaluateAsync<int>("1 + 2");

实时编译c#文本为dll

最新的包 Microsoft.CodeAnalysis.CSharp 已经支持 .net core 了,因此 .net core 下编译c#字符串已经没有任何问题了。按照下列步骤进行:

1、增加PreserveCompilationContext配置

编辑你的csproj项目文件,增加如下配置

<PropertyGroup><PreserveCompilationContext>true</PreserveCompilationContext></PropertyGroup>

2、引用包

编辑你的csproj项目文件,增加如下配置

 <ItemGroup><PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.11.0-beta1-final" /><PackageReference Include="Microsoft.Extensions.DependencyModel" Version="2.1.0" /></ItemGroup>

3、利用 DependencyContext 获取编译引用dll

MetadataReference[] _ref = DependencyContext.Default.CompileLibraries.First(cl => cl.Name == "Microsoft.NETCore.App").ResolveReferencePaths().Select(asm => MetadataReference.CreateFromFile(asm)).ToArray();

完整例子

MetadataReference[] _ref =DependencyContext.Default.CompileLibraries.First(cl => cl.Name == "Microsoft.NETCore.App").ResolveReferencePaths().Select(asm => MetadataReference.CreateFromFile(asm)).ToArray();         string testClass = @"using System; namespace test{public class tes{public string unescape(string Text){ return Uri.UnescapeDataString(Text);} }}";         var compilation = CSharpCompilation.Create(Guid.NewGuid().ToString() + ".dll").WithOptions(new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary,usings: null,optimizationLevel: OptimizationLevel.Debug, // TODOcheckOverflow: false,                       // TODOallowUnsafe: true,                          // TODOplatform: Platform.AnyCpu,warningLevel: 4,xmlReferenceResolver: null // don't support XML file references in interactive (permissions & doc comment includes))).AddReferences(_ref )).AddSyntaxTrees(CSharpSyntaxTree.ParseText(testClass));var eResult = compilation.Emit("test.dll");

引用test库

按照上述例子的步骤进行操作,成功生成test.dll文件,我引用并测试它是否可执行。

var t = new test.tes();
var txt = t.unescape("abcdefg");

一切OK,恭喜!你已经完美搞定.net core 下的动态编译c#。

总结

难点在于DependencyContext的引入,很多人都是卡在这一步,因为.net 目标编译时默认会选用 .net framework库,那么你的dll可以生成,但是没法引入到 .net core 项目中来!

注脚


  1. https://github.com/dotnet/roslyn/wiki ↩︎

  2. https://github.com/dotnet/roslyn ↩︎

  3. https://www.antlr.org/download.html ↩︎

  4. https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples ↩︎

.net core ——利用 roslyn 编译C#代码相关推荐

  1. Roslyn 编译C#代码

     Roslyn 是微软公司开源的 .NET 编译器.编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API. GITHUB地址:https://github.com ...

  2. python代码加密cython_利用Cython对python代码进行加密

    利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...

  3. linux如何编译wine,利用winelib编译一个可在linux下运行的程序

    利用winelib编译一个可在linux下运行的程序 只是想既可以使用linux的api,又可以使用windows的api #include #include #include #include in ...

  4. cython加密代码python_利用Cython对python代码进行加密

    利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...

  5. python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...

    Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言,其具有高可扩展性和高可移植性,具有广泛的标准库,受到开发者的追捧,广泛应用于开发运维(DevOps).数据科学.网站开发和安 ...

  6. 迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试

    迷你播放器--第一阶段(7) 安全攻防第一战--对抗反编译,代码混淆和对抗动态调试; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...

  7. ant脚本编译java_1.4 在Ant中编译Java代码

    1.4  在Ant中编译Java代码 在Java开发中,任何构建脚本都需要完成的一个最基本工作就是编译代码.在Ant中,任务为编译Java代码提供了方便的一次性解决方案. 下面介绍任务的简单用法.以上 ...

  8. 利用预编译技术防御SQL注入

    一.关于SQL注入 众所周知,SQL注入漏洞是一种常见的Web安全漏洞,其形成原因是服务器没有对用户输入的内容进行严格过滤,导致该内容拼接到服务器原本的SQL语句中,被当作SQL语句的一部分执行. 以 ...

  9. 攻击者已利用ChatGPT编写恶意代码

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 自OpenAI 在2022年11月发布ChatGPT以来,安全研究人员就预测称,网络犯罪分子开始利用这个AI聊天机器人编写恶意软件和执行其它恶意 ...

最新文章

  1. AI实时筛查癌细胞,普通显微镜简单改装就能用,谷歌新突破登上Nature子刊
  2. java 中断 继续_中断,继续并在Java循环中标记
  3. python3基础语法-Python3的一些基础语法介绍和理解
  4. boost::set_intersection相关的测试程序
  5. 一、在windows环境下修改pip镜像源的方法(以python3为例)
  6. 怎样设计访谈提纲_论访谈提纲的设计
  7. python 替换文本 通配符_使用通配符搜索和替换文本文件中的字符串
  8. 有哪些越早知道越好的人生经验?
  9. linux进程跑飞了,【Shell】Linux信号(二)
  10. 学习C++项目——一个基于C++11简单易用的轻量级网络编程框架 1
  11. Centos中安装memcached
  12. Gephi下载百度云加速,舒服了
  13. 基于阿里云Aliddns动态域名解析的客户端PHP实现与服务器端(包含C与PHP)实现
  14. LOJ6070 基因 分块+回文自动机
  15. IBM服务器纽扣电池告警信息,IBM笔记本数字错误码信息.doc
  16. h510主板怎么样 h510配什么cpu
  17. shell 脚本实战 三
  18. 推荐视频:神奇的大脑 之 三个错觉演示
  19. 熵值法的信息熵值、效用值如何计算?
  20. Sql Server系统数据库的作用

热门文章

  1. CentOS 5.5下搭建部署独立SVN服务器全程详解
  2. C#判断某软件是否安装
  3. 加密文件忘记密码怎么解密_MyBatis 配置文件 用户密码加密存储
  4. 模块定义文件导出类_浓缩的就是精华——ES6模块精炼讲解
  5. Linux基础命令---findfs
  6. Lua 学习笔记(一)
  7. 2012暑假最后两次组队赛总结
  8. arguments.callee()事例 参数检验
  9. 如何在VMware Player中设置和安装Windows Home Server“ Vail”
  10. pc端文本_使用即将推出的Windows功能从PC发送文本