C#编程,使用 Roslyn引擎动态编译代码
原文:https://www.cnblogs.com/WinHEC/p/Roslyn_Dynamic_Compiling.html
Roslyn引擎自2014年开源至今这么久,一直没怎么了解过,虽然VS2015早就集成了它。
以前老一套的动态编译方法在 .NET Core中似乎不再支持了,很多方法都是未实现的。下面就介绍如何在.NET Core环境中使用Roslyn进行动态编译。话不多说,Talk is cheap, show me the code.
首先是安装nuget包
Install-Package Microsoft.CodeAnalysis.CSharp
接下来是我们需要动态编译和执行的代码:
// 表达式树
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@"using System;namespace RoslynCompileSample{public class Writer{public void Write(string message){Console.WriteLine(message);}}}");
紧接着是创建编译对象:
// 随机程序集名称
string assemblyName = Path.GetRandomFileName();// 元数据引用
MetadataReference[] references = new MetadataReference[]
{MetadataReference.CreateFromFile(typeof(object).Assembly.Location),MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location)
};// 创建编译对象
CSharpCompilation compilation = CSharpCompilation.Create(assemblyName,syntaxTrees: new[] { syntaxTree },references: references,options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
然后是编译:
using (var ms = new MemoryStream())
{// 将编译后的IL代码放入内存中EmitResult result = compilation.Emit(ms);// 编译失败,提示if (!result.Success){IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error);foreach (Diagnostic diagnostic in failures){Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());}}else{// 编译成功则从内存中加载程序集ms.Seek(0, SeekOrigin.Begin);Assembly assembly = Assembly.Load(ms.ToArray());}
}
最后则是调用:
// 反射获取程序集中 的类
Type type = assembly.GetType("RoslynCompileSample.Writer");// 创建该类的实例
object obj = Activator.CreateInstance(type);// 通过反射方式调用类中的方法。(Hello World 便是我们传入方法的参数)
type.InvokeMember("Write",BindingFlags.Default | BindingFlags.InvokeMethod,null,obj,new object[] { "Hello World" });
最后咱们可以封装一个方法,以便于调用:
/// <summary>
/// 动态编译
/// </summary>
/// <param name="code">需要动态编译的代码</param>
/// <returns>动态生成的程序集</returns>
public static Assembly GenerateAssemblyFromCode(string code)
{Assembly assembly = null;// 丛代码中转换表达式树SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);// 随机程序集名称string assemblyName = Path.GetRandomFileName();// 引用var references = AppDomain.CurrentDomain.GetAssemblies().Select(x => MetadataReference.CreateFromFile(x.Location));// 创建编译对象CSharpCompilation compilation = CSharpCompilation.Create(assemblyName, new[] { syntaxTree }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));using (var ms = new MemoryStream()) {// 将编译好的IL代码放入内存流EmitResult result = compilation.Emit(ms);// 编译失败,提示if (!result.Success) {IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error);foreach (Diagnostic diagnostic in failures) {Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());}} else {// 编译成功,从内存中加载编译好的程序集ms.Seek(0, SeekOrigin.Begin);assembly = Assembly.Load(ms.ToArray());}}return assembly;
}
C#编程,使用 Roslyn引擎动态编译代码相关推荐
- 基于 Roslyn 实现动态编译
基于 Roslyn 实现动态编译 Intro 之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句,原来是基于 CodeDom 实现的,最近改成使用基于 Roslyn ...
- 基于roslyn的动态编译库Natasha
人老了,玩不转博客园的编辑器,详细信息转到:https://mp.weixin.qq.com/s/1r6YKBkyovQSMUgfm_VxBg 关键字:Github, NCC, Natasha,Ros ...
- NetCore基于Roslyn的动态编译实现
目录 一. AvalonEdit文本器 1.功能实现 2. 高亮 3. 代码提示 4. 动态编译 1)依赖项初始化 2) 编译函数 二. 运行效果展示 三. 源码链接 四. 参考资料 一. Avalo ...
- python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...
- python 动态编译代码_编译Python代码以使用Cython静态链接可执行文...
经验丰富的问题??显然来自链接器(gcc在引擎盖下启动了一个链接器,看到它 – 只需用详细模式启动带有-v的gcc).那么让我们先简要提醒链接过程如何工作: 链接器保留其需要解析的所有符号的名称.在开 ...
- C#实现动态编译代码
/*------------------------------------------------------------------------------* Copyright (C) 2013 ...
- python 动态编译代码,Python:在运行时动态创建函数
How to dynamically create a function in Python? I saw a few answers here but I couldn't find one whi ...
- ZKWeb网站框架的动态编译的实现原理
ZKWeb网站框架是一个自主开发的网页框架,实现了动态插件和自动编译功能. ZKWeb把一个文件夹当成是一个插件,无需使用csproj或xproj等形式的项目文件管理,并且支持修改插件代码后自动重新编 ...
- Java脚本引擎执行js代码以及动态编译
Java脚本引擎执行js代码 一.概述 JAVA脚本引擎是从JDK6.0之后添加的新功能. 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本 ...
- C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎
本章说明 在前面章节中,笔者使用了反射和动态编译技术实现了快速ORM框架,在本章中笔者将继续使用这些技术来实现一个VB.NET的脚本引擎,使得人们在开发中能实现类似MS Office那样实现VBA宏的 ...
最新文章
- IE9最终版透露IE10信息 或将自动在线升级
- C/C++-style输入输出函数
- 软件项目管理的75条建议
- python scrapy教程实例_Python之scrapy实例1
- ArcGIS实验教程——实验十八:叠置分析(Overlay Analysis)
- jvm线程分析命令_JVM:如何分析线程转储
- 63. Unique Paths II and 64. Minimum Path Sum
- 【英语学习】【WOTD】remittance 释义/词源/示例
- 对天气数据进行简单的数据分析
- Python中的三目表达式
- android badgeview activity不显示,关于BadgeView遇到的一个奇怪的问题和解决办法
- 过程试图写入的管道不存在
- 好妈妈胜过好老师 书摘
- 编译原理学习笔记 5.1 翻译文法和语法制导翻译
- 人生有很多捷径可以走,我却偏偏说不
- 苏宁易购:商品详情系统架构设计读后感
- SqlServer入门学习总结(一)
- 使用ResNet18实现CIFAR10数据集的训练
- Hyperledger Fabric 1.2.1启用CouchDB作为状态数据库
- 一个人的浪漫 2012.3.3