原文: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引擎动态编译代码相关推荐

  1. 基于 Roslyn 实现动态编译

    基于 Roslyn 实现动态编译 Intro 之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句,原来是基于 CodeDom 实现的,最近改成使用基于 Roslyn ...

  2. 基于roslyn的动态编译库Natasha

    人老了,玩不转博客园的编辑器,详细信息转到:https://mp.weixin.qq.com/s/1r6YKBkyovQSMUgfm_VxBg 关键字:Github, NCC, Natasha,Ros ...

  3. NetCore基于Roslyn的动态编译实现

    目录 一. AvalonEdit文本器 1.功能实现 2. 高亮 3. 代码提示 4. 动态编译 1)依赖项初始化 2) 编译函数 二. 运行效果展示 三. 源码链接 四. 参考资料 一. Avalo ...

  4. python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器

    PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...

  5. python 动态编译代码_编译Python代码以使用Cython静态链接可执行文...

    经验丰富的问题??显然来自链接器(gcc在引擎盖下启动了一个链接器,看到它 – 只需用详细模式启动带有-v的gcc).那么让我们先简要提醒链接过程如何工作: 链接器保留其需要解析的所有符号的名称.在开 ...

  6. C#实现动态编译代码

    /*------------------------------------------------------------------------------* Copyright (C) 2013 ...

  7. python 动态编译代码,Python:在运行时动态创建函数

    How to dynamically create a function in Python? I saw a few answers here but I couldn't find one whi ...

  8. ZKWeb网站框架的动态编译的实现原理

    ZKWeb网站框架是一个自主开发的网页框架,实现了动态插件和自动编译功能. ZKWeb把一个文件夹当成是一个插件,无需使用csproj或xproj等形式的项目文件管理,并且支持修改插件代码后自动重新编 ...

  9. Java脚本引擎执行js代码以及动态编译

    Java脚本引擎执行js代码 一.概述 JAVA脚本引擎是从JDK6.0之后添加的新功能. 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本 ...

  10. C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎

    本章说明 在前面章节中,笔者使用了反射和动态编译技术实现了快速ORM框架,在本章中笔者将继续使用这些技术来实现一个VB.NET的脚本引擎,使得人们在开发中能实现类似MS Office那样实现VBA宏的 ...

最新文章

  1. IE9最终版透露IE10信息 或将自动在线升级
  2. C/C++-style输入输出函数
  3. 软件项目管理的75条建议
  4. python scrapy教程实例_Python之scrapy实例1
  5. ArcGIS实验教程——实验十八:叠置分析(Overlay Analysis)
  6. jvm线程分析命令_JVM:如何分析线程转储
  7. 63. Unique Paths II and 64. Minimum Path Sum
  8. 【英语学习】【WOTD】remittance 释义/词源/示例
  9. 对天气数据进行简单的数据分析
  10. Python中的三目表达式
  11. android badgeview activity不显示,关于BadgeView遇到的一个奇怪的问题和解决办法
  12. 过程试图写入的管道不存在
  13. 好妈妈胜过好老师 书摘
  14. 编译原理学习笔记 5.1 翻译文法和语法制导翻译
  15. 人生有很多捷径可以走,我却偏偏说不
  16. 苏宁易购:商品详情系统架构设计读后感
  17. SqlServer入门学习总结(一)
  18. 使用ResNet18实现CIFAR10数据集的训练
  19. Hyperledger Fabric 1.2.1启用CouchDB作为状态数据库
  20. 一个人的浪漫 2012.3.3

热门文章

  1. android通讯录管理软件,号簿管理更轻松 Android通讯录软件合集
  2. 《大型网站技术架构》读书笔记
  3. 网络安全技术复习资料
  4. java7 xp版下载64位,xp32位系统可用最高版本jdk64位系统win10 64位系统
  5. O2O电子商务 营销模式
  6. 国美金融贷款绝对定位与相对定位的关系(国美金融贷款位置)
  7. 【读书笔记】《认知语义学》序言
  8. 向量空间的基和维数例题_向量空间基和维数的等价定义及求法
  9. 就百度指数对比分析“微博”与“知乎”搜索人数
  10. 浅谈vocaloid3基础操作