.net core ——利用 roslyn 编译C#代码

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 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

期货市场计算机分析指南在线,期货市场计算机分析指南

39.60定价&#xff1a;55.00(7.2折)(美)勒博&#xff0c;(美)卢卡斯 著&#xff0c;何苗 译/2012-04-01《期货市场计算机分析指南》花费了作者大量的心血&#xff0c;这从书中的内容就可以看出。我所读过的有关技术分析的大部分书未能给各种技巧及随后的交易方法打下坚实的基础…

吃货都是怎么给自己找理由的? | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;看得我都饿了↓ ↓ ↓

用SharpZipLib来压缩和解压文件 --zt

from:http://www.cnblogs.com/zhangweiguo3984/archive/2007/03/15/314333.html#6756341.建立工程&#xff0c;添加引用&#xff0c;添加SharpZipLib.dll2.建立压缩和解压类CompressionFile.cs添加如下代码usingSystem;usingSystem.IO;usingICSharpCode.SharpZipLib.Zip;usingI…

vue 给取data值_web前端教程分享Vue相关面试题

Vue是一套构建用户界面的渐进式框架&#xff0c;具有简单易用、性能好、前后端分离等优势&#xff0c;是web前端工程师工作的好帮手&#xff0c;也是企业选拔人才时考察的重点技能。接下来就给大家分享一些Vue相关的面试题&#xff0c;帮助大家提升竞争力。你对Vue生命周期的理…

.NET Core with 微服务 - Consul 配置中心

上一次我们介绍了Elastic APM组件。这一次我们继续介绍微服务相关组件配置中心的使用方法。本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大&#xff0c;还是让我爱不起来。因为前面我们已经介绍了使用Consul 做为服务注册发现的组件&#xff0c;那…

计算机应用技术编译原理考试题,《编译原理》练习题库含答案(大学期末复习资料).doc...

《编译原理》练习测试题库一、填空1.若源程序是用高级语言编写的&#xff0c;目标程序是______&#xff0c;则其翻译程序称为编译程序。2.词法分析和语法分析本质上都是对源程序的______进行分析。3.如果源语言(编写源程序的语言)是高级语言&#xff0c;而目标语言是某计算机的…

程序员最爱说的十句口头禅。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅1、别更新了学不动了。2、我不会修电脑&#xff0c;谢谢。3、听说今晚不用加班。4、是你的网络有问题。5、清一下缓存再试试6、扫码提需求&#xff0c;谢谢。7、换一台设备试试看。8、保证今晚十点上线。9、键盘给你&#xff0c;你来写…

将Reporting Service 2005 SP2集成部署到WSS3或MOSS2007服务器场心得

关于WSS3和MOSS2007安装部署方面的资料已经很多&#xff0c;我这里就不说了&#xff0c;我这里说的是怎样快速、顺利地以继承方式部署Reporting Service Server 2005 SP2到WSS3和MOSS2007服务器场的一点心得&#xff08;个人观点&#xff09;&#xff0c;其实在单服务器部署&am…

.NET 6 新特性 System.Text.Json 中的 Writeable DOM

.NET 6 新特性 System.Text.Json 中的 Writeable DOM 特性Intro在 .NET 6 Preview 4 中&#xff0c;微软加入了 JSON Node 的支持&#xff0c;我们可以动态的编辑一个 JSON 文档&#xff0c;一个可以修改的 JSON 文档&#xff0c;就像 Newtonsoft.Json 里的 JToken&#xff0c;…

ArcGISServer10安装与地图发布

1.安装ArcGISServer10前先启动IIS&#xff0c;并打开IIS管理器界面&#xff0c;检查是否已经安装好。2.新建一个自己的站点打开Internet信息服务&#xff08;IIS&#xff09;管理器&#xff0c;右击左侧的网站列表&#xff0c;选择——添加网站&#xff0c;如下图所示&#xff…

电影特效用到什么计算机知识,后期影视特效处理知识普及

电影特效作为电影产业中不可或缺的元素之一&#xff0c;为电影的发展做出了巨大的贡献。今天小编主要给大家分享后期影视特效处理知识普及&#xff0c;希望对你们有帮助!影视特效改变电影制作的方式在目前的电影制作过程中&#xff0c;从分镜头剧本开始&#xff0c;特效的理念已…

通达信版弘历软件指标_通达信软件指标编写基础教程,10个指标源码祝你股市一帆风顺...

一、基本函数HHV&#xff08;X,N&#xff09; N日内X的最高价LLV&#xff08;X,N&#xff09; N日内X的最低价VOL 成交量AND 和&#xff0c;表示同时满足MA&#xff08;X,N&#xff09; 移动平均线&#xff0c;5日均线可以写作MA&#xff08;CLOSE&#xff0c;5&#xff09;&am…

魔方内部长啥样?三维动画展示其结构,谁发明的真是个天才

全世界只有3.14 % 的人关注了青少年数学之旅魔方&#xff0c;英文名为Rubiks Cube&#xff0c;又叫鲁比克方块&#xff0c;最早是由匈牙利布达佩斯建筑学院厄尔诺鲁比克&#xff08;又称作厄尔诺卢比克&#xff09;教授于1974年发明的。魔方竞速是一项手部极限运动。咱们平时看…

[导入]ASP.NET中上传并读取Excel文件数据

首先&#xff0c;创建一个Web应用程序项目&#xff0c;在Web页中添加一个DataGrid控件、一个文件控件和一个按钮控件。<INPUT id"File1" type"file" name"File1" runat"server"><asp:Button id"Button1" runat&quo…

Hello Blazor:(2)集成Tailwind CSS续——nuget包方式

前段时间&#xff0c;写了一篇“Blazor如何集成Tailwind CSS”的文章。但是操作起来比较麻烦&#xff0c;又是命令行&#xff0c;又是要修改一大堆配置。后来&#xff0c;我又找到一个更简单的方法。实现方式新建Blazor项目&#xff0c;然后引用nuget包BamButz.MSBuild.Tailwin…

TCP连接——三次握手和四次断开

1.面向连接TCP是一个面向连接的协议&#xff0c;面向连接是指任何一方向对方发送数据前必须先建立通道&#xff0c;比如像打电话一样&#xff1a;必须要等到对方的手机响铃&#xff0c;并且对方接听电话时&#xff0c;才能与对方通信。而UDP则不是面向连接的协议&#xff0c;基…

30屏幕参数_顶级屏幕加持,一加8系列核心配置、屏幕参数官方公布

昨天&#xff0c;一加8系列官宣将于4月16日进行线上发布。届时&#xff0c;全新的一加8系列将正式到来。随着官宣的开启&#xff0c;一加手机也开始了新机的预热。参数配置上&#xff0c;一加官方剧透称&#xff0c;一加8系列全系标配骁龙865 5G旗舰级移动平台&#xff0c;全系…

陕西科技大学18计算机调剂,2018年陕西科技大学考研调剂信息公布

2018考研复试交流群(进群领内部资料) 5764338402018年陕西科技大学考研调剂信息公布2018年考研成绩查询接近尾声&#xff0c;部分成绩不太理想的考生可能会考虑考研调剂&#xff0c;为了方便考生&#xff0c;中公考研小编为大家整理了2018年陕西科技大学考研调剂信息公布&#…

垃圾软件!动不动就扣费!| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、二、三、四、五、&#xff08;图源网络&#xff0c;侵权删&#xff09;我怀疑有人偷窥我生活↓ ↓ ↓

Effective C# 原则35:选择重写函数而不是使用事件句柄(译)

Effective C# 原则35&#xff1a;选择重写函数而不是使用事件句柄Item 35: Prefer Overrides to Event Handlers 很多.Net类提供了两种不同的方法来控制一些系统的事件。那就是&#xff0c;要么添加一个事件句柄&#xff1b;要么重写基类的虚函数。为什么要提供两个方法来完成同…