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

Roslyn在vs2013上通过在 Manage NuGet Packages 中下载安装Microsoft.CodeAnalysis、Microsoft.CodeAnalysis.CSharp、Microsoft.CodeAnalysis.VisualBasic组件以后,
便可以在C#项目和VB项目中使用Roslyn的API。

下面是一段使用Roslyn API编写的C#编译器。

public class CSharpScriptEngine{private static Script _previousInput;private static Lazy<object> _nextInputState = new Lazy<object>();private static ScriptOptions _options;public static void AddReferenceAndNameSpace(string[] assemblys,string[] namespaces){ScriptOptions _option = ScriptOptions.Default;if (assemblys != null && assemblys.Length > 0){foreach (string item in assemblys){var type = Type.GetType(item);if (type == null){type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(obj => obj.GetType(item) != null).GetType(item);}_option=_option.AddReferences(Assembly.GetAssembly(type));}}if (namespaces != null && namespaces.Length > 0){_option=_option.AddNamespaces(namespaces);}_options = _option;}public static object Execute(string code){var script = CSharpScript.Create(code, ScriptOptions.Default).WithPrevious(_previousInput).WithOptions(_options);var endState = script.Run(_nextInputState.Value);_previousInput = endState.Script;_nextInputState = new Lazy<object>(() => endState);return endState.ReturnValue;}}

通过调用CSharpScriptEngine中的Execute方法来实现在项目的代码实现期动态的编译我们输入的C#代码,
编译后的代码似乎并不嵌入到原代码(编译以后)中,所以我们需要指定引入代码中需要的Assembly和Namespace,
AddReferenceAndNameSpace方法便是在做这件事。

下面写个简单的测试代码来测试上面的编译器是否可以正常工作。

public void TestCSharpScriptEngine(){string script = @"PowerShellEngine.Invoke(""Get-Date"",null)";string[] assemblys = { "MyWebProjectService.CSharpScriptEngine", "System.Management.Automation.PSObject", "System.Collections.ObjectModel.Collection`1" };string[] namespaces = { "MyWebProjectService" };CSharpScriptEngine.AddReferenceAndNameSpace(assemblys,namespaces);Collection<PSObject> result = (Collection<PSObject>)CSharpScriptEngine.Execute(script);}

测试代码中我们动态给加入我们自己写的C#代码 “PowerShellEngine.Invoke(""Get-Date"",null)” 调用PowerShellEngine
类的Invoke方法来执行一个Get-Date命令。

这里有篇文章比较详细的介绍了Roslyn API的各种用法:http://www.daveaglick.com/posts/compiler-platform-scripting

Roslyn 编译C#代码相关推荐

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

    Rosyln介绍 Rosyln1 是 .NET Core和 .NET 4.6+ 中 的C# .VB的编译器,宇宙最强IDE Visual Studio 也是使用其来编译代码的, 基于编译器也是服务的理 ...

  2. python的代码编译、代码打包方法

    python的代码编译.代码打包方法 代码编译 把代码编译成pyc文件 import py_compilepy_compile.compile(r'文件路径') 或者直接在terminal中运行 py ...

  3. 使用DOSBox编译汇编代码

    安装 DOSBox:https://blog.csdn.net/qq_44989881/article/details/117266756 配置环境变量 添加后,在DOSBox控制台中输入 masm, ...

  4. eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件

    导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件.将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提 ...

  5. IAR软件中直接查看编译后代码大小

      在使用IAR软件编译代码时,编译后往往看不到编译后代码的大小情况.在调试程序的时候还是比较麻烦的.下面就总结两种最简单的方法在IAR编译器中查看代码大小. 通过输出的编译信息查看   IAR默认的 ...

  6. QCA-WIFI如何编译IPQ8074代码

    QCA-WIFI如何编译IPQ8074代码 生成代码 编译代码 本文以QCA的IPQ807x芯片作为编译说明(需要有相关release文档): 生成代码 1,如果自己有下面代码,可以不执行,否则要到Q ...

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

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

  8. windows平台下载并编译webrtc代码(代理)2021.8.11

    好久没更写新博客了,当然好久没更新webrtc代码了,突发奇想拉去最新代码,无奈找了很多办法不行.经过不懈努力还是找到了简单实用的方法,现分享与大家. **注意:**起步之前,你需要配置科学上网方法, ...

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

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

最新文章

  1. 自学python可以做什么兼职-一行生财:毕业100天,通过副业赚(挣)到我的第一个10w...
  2. NOI2015 程序自动分析
  3. 【Python-ML】抽取最优化分类的特征子空间的LDA方法
  4. Regex 正则零宽断言
  5. 2000年不算在21世纪
  6. 085 Maximal Rectangle 最大矩形
  7. mysql 5.7 多主一从_mysql5.7多主一从,从机调优
  8. Query Generation Module-NTU用多样性的query生成,涨点基于文本的实例分割(已开源)...
  9. maven 项目 spring mvc + jdbc 配置文件
  10. 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。报错...
  11. 蓝宝石rx470d原版bios_AMD RX470/570强刷RX580完整图文教程(附文件下载及查BIOS攻略)...
  12. C4认证Java基础Excel练习题
  13. 计算机spec分值怎么算,四级怎么算分数公式(历年四级常模均值)
  14. 云计算基础与应用 第二章 云计算技术架构
  15. Excel 解决高次方程求解的方法
  16. 家庭教育中有近一半是由母亲负责孩子学习,占49%,父亲负责仅占10%
  17. Hey UI源码市场
  18. Instruction set mismatch
  19. linux-pam 编译,PAM后门编译安装
  20. 小程序反编译-获取源码

热门文章

  1. IDEA下载及用校园邮箱激活
  2. 如何使用redis生成流水号
  3. 泰凌微BDT烧录软件遇到的问题
  4. 修改盒子上的host文件
  5. TPS793475DBVREP
  6. VISIONPRO中使用工业相机采集图像的两种方式分享
  7. 数据库E-R图与关系模式图
  8. PB编辑器里怎么查看代码行数
  9. 大家都在用哪些研发协同、沟通协同、项目协同软件?
  10. NB-IOT开发|nbiot开发教程《五》nbiot(移远BC26)电信物联网平台实现MCU固件在线升级(STM32L051+BC26)