Roslyn 编译C#代码
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#代码相关推荐
- .net core ——利用 roslyn 编译C#代码
Rosyln介绍 Rosyln1 是 .NET Core和 .NET 4.6+ 中 的C# .VB的编译器,宇宙最强IDE Visual Studio 也是使用其来编译代码的, 基于编译器也是服务的理 ...
- python的代码编译、代码打包方法
python的代码编译.代码打包方法 代码编译 把代码编译成pyc文件 import py_compilepy_compile.compile(r'文件路径') 或者直接在terminal中运行 py ...
- 使用DOSBox编译汇编代码
安装 DOSBox:https://blog.csdn.net/qq_44989881/article/details/117266756 配置环境变量 添加后,在DOSBox控制台中输入 masm, ...
- eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件
导读: 最近在看 Flink 源码的时候发现到一段实用的代码,该代码实现了 java 动态编译以及生成 jar 文件.将其进行改进后可以应用到我们的平台上,实现在平台页面上编写 java 代码语句,提 ...
- IAR软件中直接查看编译后代码大小
在使用IAR软件编译代码时,编译后往往看不到编译后代码的大小情况.在调试程序的时候还是比较麻烦的.下面就总结两种最简单的方法在IAR编译器中查看代码大小. 通过输出的编译信息查看 IAR默认的 ...
- QCA-WIFI如何编译IPQ8074代码
QCA-WIFI如何编译IPQ8074代码 生成代码 编译代码 本文以QCA的IPQ807x芯片作为编译说明(需要有相关release文档): 生成代码 1,如果自己有下面代码,可以不执行,否则要到Q ...
- 迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试
迷你播放器--第一阶段(7) 安全攻防第一战--对抗反编译,代码混淆和对抗动态调试; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...
- windows平台下载并编译webrtc代码(代理)2021.8.11
好久没更写新博客了,当然好久没更新webrtc代码了,突发奇想拉去最新代码,无奈找了很多办法不行.经过不懈努力还是找到了简单实用的方法,现分享与大家. **注意:**起步之前,你需要配置科学上网方法, ...
- ant脚本编译java_1.4 在Ant中编译Java代码
1.4 在Ant中编译Java代码 在Java开发中,任何构建脚本都需要完成的一个最基本工作就是编译代码.在Ant中,任务为编译Java代码提供了方便的一次性解决方案. 下面介绍任务的简单用法.以上 ...
最新文章
- 自学python可以做什么兼职-一行生财:毕业100天,通过副业赚(挣)到我的第一个10w...
- NOI2015 程序自动分析
- 【Python-ML】抽取最优化分类的特征子空间的LDA方法
- Regex 正则零宽断言
- 2000年不算在21世纪
- 085 Maximal Rectangle 最大矩形
- mysql 5.7 多主一从_mysql5.7多主一从,从机调优
- Query Generation Module-NTU用多样性的query生成,涨点基于文本的实例分割(已开源)...
- maven 项目 spring mvc + jdbc 配置文件
- 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。报错...
- 蓝宝石rx470d原版bios_AMD RX470/570强刷RX580完整图文教程(附文件下载及查BIOS攻略)...
- C4认证Java基础Excel练习题
- 计算机spec分值怎么算,四级怎么算分数公式(历年四级常模均值)
- 云计算基础与应用 第二章 云计算技术架构
- Excel 解决高次方程求解的方法
- 家庭教育中有近一半是由母亲负责孩子学习,占49%,父亲负责仅占10%
- Hey UI源码市场
- Instruction set mismatch
- linux-pam 编译,PAM后门编译安装
- 小程序反编译-获取源码