NetCore基于Roslyn的动态编译实现

news2024/12/27 2:18:51

目录

一. AvalonEdit文本器

1.功能实现

2. 高亮

3. 代码提示

二. 运行效果展示

三. 源码链接

四. 参考资料


一. AvalonEdit文本器

1.功能实现

        直接用Github上的源码进行实现,icsharpcode/AvalonEdit:The WPF-based text editor component used in SharpDevelop,源码地址见参考资料1,以下是文本器的使用方法

/// <summary>
/// 脚本显示初始化
/// </summary>
private void ScriptInit()
{
    //文本编辑器定义
    _editor.FontFamily = new System.Windows.Media.FontFamily("Consolas");
    _editor.FontSize = 12;
    _editor.Completion = MyScriptProvider.Instance(new ScriptProvider(), ScriptProvider.GetRelativeAssemblies())._csharpCompletion;
    _editor.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
    _editor.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
    if (!string.IsNullOrWhiteSpace(_moduleObj.InCode))
    {
        _editor.Text = _moduleObj.InCode;
    }
    string fileName = "TEST";
    _editor.FileName = fileName;
    _editor.Document.FileName = fileName;
    elementHost.Child = _editor;
    elementHost.Dock = DockStyle.Fill;
    this.splitContainer4.Panel1.Controls.Add(elementHost);

    //设置高亮
    _editor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("C#");
}

注意:

1)文本器CodeTextEditor是基于Control写的,如果是Form窗体需要用ElementHost容器包一下才能使用

2)关闭编译器窗体对象时,需要主动销毁CodeTextEditor和ElementHost,否则即使是托管内存,C#自动销毁特别缓慢,容易造成软件系统因为占用内存较大而卡顿(个人不建议定时器GC回收,原因是对高速项目,GC很容易引起系统短时间卡顿,而带来不可预知的问题,因此对占用较大的托管资源要主动销毁)

3)如果是Wpf的Window调用CodeTextEditor,如果在xaml语言里面写的,就不需要主动释放控件资源

主动释放控件资源代码:

private void button_Cancel_Click(object sender, EventArgs e)
{
    //主动释放托管内存
    _editor.Clear();
    _editor = null;
    elementHost.Controls.Clear();
    elementHost.Dispose();
    elementHost = null;
    GC.Collect();

    this.Close();
}

2. 高亮

editor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("C#");

3. 代码提示

    源码中代码提示功能有限,需要结合NRefactory包,实现功能更强大的代码提示,具体参考代码见参考资料2,不过参考资料2中的代码提示,每次输入字符/数字都需要重新查询所有的依赖项内容,造成较大的资源开销,关键代码修改如下(这样,只有输入点.时才会重新查询方法项目)

/// <summary>
/// 文本器提示结果,当result为空时才获取结果
/// </summary>
CodeCompletionResult resultsWhole = null;
private void ShowCompletion(string enteredText, bool controlSpace)
{
	if (!controlSpace)
		Debug.WriteLine("Code Completion: TextEntered: " + enteredText);
	else
		Debug.WriteLine("Code Completion: Ctrl+Space");

	only process csharp files and if there is a code completion engine available
	//if (String.IsNullOrEmpty(Document.FileName)) {
	//	Debug.WriteLine("No document file name, cannot run code completion");
	//	return;
	//}


	if (Completion == null) {
		Debug.WriteLine("Code completion is null, cannot run code completion");
		return;
	}

	//var fileExtension = Path.GetExtension(Document.FileName);
	//fileExtension = fileExtension != null ? fileExtension.ToLower() : null;
	check file extension to be a c# file (.cs, .csx, etc.)
	//if (fileExtension == null || (!fileExtension.StartsWith(".cs"))) {
	//	Debug.WriteLine("Wrong file extension, cannot run code completion");
	//	return;
	//}

	if (completionWindow == null) {
		CodeCompletionResult results = null;
		try {
			var offset = 0;
			var doc = GetCompletionDocument(out offset);
			if (results == null || results.CompletionData.Count == 0 || enteredText == ".")
			{
				results = Completion.GetCompletions(doc, offset, controlSpace);
			}
            else
            {
				results = resultsWhole;

			}
		} catch (Exception exception) {
			Debug.WriteLine("Error in getting completion: " + exception);
		}
		if (results == null)
			return;

		if (completionWindow == null && results != null && results.CompletionData.Any()) {
			// Open code completion after the user has pressed dot:
			completionWindow = new CompletionWindow(TextArea);
			completionWindow.CloseWhenCaretAtBeginning = controlSpace;
			completionWindow.StartOffset -= results.TriggerWordLength;
			//completionWindow.EndOffset -= results.TriggerWordLength;

			IList<ICompletionData> data = completionWindow.CompletionList.CompletionData;
			foreach (var completion in results.CompletionData.OrderBy(item => item.Text)) {
				data.Add(completion);
			}
			if (results.TriggerWordLength > 0) {
				//completionWindow.CompletionList.IsFiltering = false;
				completionWindow.CompletionList.SelectItem(results.TriggerWord);
			}
			completionWindow.Show();
			completionWindow.Closed += (o, args) => completionWindow = null;
		}
	}//end if
}//end method

二. 运行效果展示

实现功能:

1. 编辑脚本内容

2. 编译脚本

3.运行脚本

三. 源码链接

CSDN资源

(9条消息) AvalonEdit文本器+NRefactory代码提示+Roslyn动态编译-C#文档类资源-CSDN文库

---------------------------------------------------------------------------------------------------------------------

四. 参考资料

动态编译器的两个github源码,可以学习下:

1. AvalonEdit源码:
GitHub - icsharpcode/AvalonEdit: The WPF-based text editor component used in SharpDevelop

2. AvalonEdit(源码的代码提示部分用NRefactory进行修改)+Roslyn实现动态编译器的demo
GitHub - lukebuehler/NRefactory-Completion-Sample: A small but full featured prototype how to do code completion with NRefactory

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

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

相关文章

在R语言中使用概率分布:dnorm,pnorm,qnorm和rnorm

在这里&#xff0c;我将讨论哪些函数可用于处理正态分布&#xff1a;dnorm&#xff0c;pnorm&#xff0c;qnorm和rnorm。 R中的分布函数 有四个关联的函数&#xff0c; 四个正态分布函数是&#xff1a; d范数&#xff1a;正态分布的密度函数p范数&#xff1a;正态分布的累积密…

【Spring】SpringBoot 配置 log4j2 日志

1. 概述 Apache Log4j2 是对原先的 Log4j 项目的升级版本&#xff0c;参考了 logback 的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升。 2. 案例与解析 2.1 引入依赖 SpringBoot 的 starter 自带的是 logback 日志&#xff0c;若要使…

数据结构Data Structure和算法Algorithm导航目录(持续更新)

文章目录1. 大纲2. 算法基础3. 数据结构3.1 线性结构3.1.1 字符串3.1.2 线性表3.1.3 Hash表3.1.4 栈3.1.5 队列3.1.6 位图3.2 逻辑结构3.2.1 树3.2.1.1 二叉树3.2.1.2 动态查找树3.2.1.3 多路查找树3.2.2 图3.2.4 堆4. 算法4.1 排序4.2 查找5. 领域算法6. 优秀算法赏析1. 大纲 …

STM32F4 | 按键输入实验

文章目录一、STM32F4 IO 口简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置 IO 口输出这一章&#xff0c;我们将通过 ALIENTEK阿波罗 STM32 开发板上载有的 4 个按钮&#xff08; KEY_UP、 KEY0、 KEY1 和 KEY2&#xff09;&#xff0c;来控制板上的 2 个 L…

成功的项目管理需要做好哪些方面?

每一个项目都代表了为公司建立同行竞争优势和提高利润的方式&#xff0c;成功交付的项目会将公司与那些竞争激烈的公司区分开来。而项目的成功取决于不同的因素。这也是项目经理所需要关注的问题&#xff0c;在每一个项目成功标准方面保持一致可以消除项目失败的风险&#xff0…

【数据库课程设计】SQLServer数据库课程设计(学生宿舍管理),课设报告+源码+数据库关系图

数据库课程设计——学生宿舍管理&#xff0c;需要全部源码可以关注私信我&#xff0c;把邮箱发在评论区前言一、课题背景和开发环境1、课题背景2、开发环境二、系统功能及示意图1、系统实现功能2、功能示意图2.1学生模块2.2管理人员模块三、概念结构设计1、管理员分配宿舍E_R图…

传染病模型3

一、研究方向 建立传染病的数学模型描述传染病的传播过程 分析感染人数的变化规律&#xff0c;预测传染病高峰的到来 探索控制、根除、预防传染病传播蔓延的手段 二、舱室 流行病学中的一大类模型&#xff0c;称为“舱室”模型&#xff0c;它是将人群分成若干个“舱室…

为什么机器码、汇编不可移植,而C语言可以移植?

1、机器码不可移植的原因 机器码&#xff08;二进制&#xff09;是处理器能直接识别的语言&#xff0c;不同的机器码代表不同的运算指令&#xff0c;处理器可以识别哪些机器码是由处理器的硬件设备决定的&#xff0c;不同的处理器机器码可能不同。 比如在ARM处理器上加法可能…

Linux 线程池

文章目录线程池的定义使用线程池的原因基于POSIX实现的线程池基于block队列的线程池实现基于ring队列的线程池实现设计单例模式线程池线程池的定义 线程池就一堆已经创建好的任务线程&#xff0c;初始它们都处于空闲等待状态&#xff0c;当有新的任务需要处理的时候&#xff0…

大话设计模型 Task01:设计原则

目录1. 单一职责原则&#xff08;SRP&#xff09;使用动机如何使用2. 开闭原则&#xff08;OCP&#xff09;使用动机如何使用使用原则3. 依赖倒置原则&#xff08;DIP&#xff09;使用动机使用原则4. 里氏替换原则&#xff08;LSP&#xff09;使用动机5. 迪米特法则&#xff08…

12、MInio文件系统的使用小记一

前言&#xff1a;文档存储从最初的文本文档发展到现在的图片视频存储&#xff0c;存储容器也从数据库演变成了文件系统&#xff0c;目前市面上提供云存储的公司很多&#xff0c;百度腾讯阿里华为等&#xff0c;这些公司都有成熟的文件存储方案及restapi接口&#xff0c;很方便&…

Docker-网络配置

目录 一&#xff0c;网络模式 1.bridge模式&#xff08;默认模式&#xff09; 2.host模式 二&#xff0c;bridge模式 三&#xff0c;host模式 网络模式与数据卷容器挂载的操作 三&#xff0c;如何创建自定义网络 一&#xff0c;网络模式 Docker在创建容器时有四种网络模式…

Sulfo CY5-马来酰亚胺|Cyanine5 MAL菁染料CY5标记

Sulfo CY5-马来酰亚胺|Cyanine5 MAL菁染料CY5标记 Cyanine5 maleimide是单一活性染料&#xff0c;有选择性的与硫醇基团&#xff08;比如蛋白和多肽的半胱氨酸&#xff09;结合以进行标记。我们使用水溶的Sulfo-Cyanine5 maleimide标记抗体和其他敏感蛋白。Cyanine5是Cy5的类似…

web前端设计与开发期末作品_期末大作业【使用HTML制作汽车首页】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

校园二手商品交易平台的设计与实现(J2EE)

目 录 摘要 I Abstract II 目录 III 1 绪论 1 1.1 课题研究背景及意义 1 1.2 本课题主要工作 1 2 系统相关技术 3 2.1 J2EE技术 3 2.2 MVC模式 4 2.3 B/S结构 4 2.4 数据库技术 4 3 系统需求分析 6 3.1 用户功能需求 6 3.2 系统可行性分析 6 3.2.1 技术可行性 6 3.2.2 经济可行…

Qt扫盲-QComboBox理论总结

QComboBox理论总结1. 简述2. 显示内容3. 信号4. 常用功能5. model/view 使用1. 简述 QComboBox 提供了一种以占用最小屏幕空间的方式向用户显示选项列表的方法。QCombox是显示当前项目的选择小部件&#xff0c;可以弹出可选项目的列表。QComBox其实就是一个下拉列表。选择的项…

做短视频开直播要不要买流量?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 做短视频要不要买流量&#xff0c;开直播要不要买流量&#xff0c;买了流量以后是不是就要一直买&#xff0c;不买就没有免费流量了? 在这儿给大家普及一下这件事&#xff1a; 在买流量之前呢&…

一种多臂PEG衍生物——8-Arm peg-Biotin,8-Arm PEG-Biotin,八臂PEG生物素

英文名称&#xff1a;8-Arm peg-Biotin 中文名称&#xff1a;八臂-聚乙二醇-生物素 8臂PEG生物素是一种多臂PEG衍生物&#xff0c;在连接到一个六甘油核心的八个臂的每个末端具有生物素基团。PEG生物素可通过与链霉亲和素和抗生物素结合进行聚乙二醇化&#xff0c;具有高亲和…

python语言Django框架搭建学生信息管理系统

1.系统介绍 本系统是基于Django 2.2.3开发的,面向学生信息管理系统。 系统以学生个体为核心向外拓展诸如宿舍、班级、学生组织等一系列组,诸如请假、签到、通知发布等一系列应用。 计划内实现功能有:班级、学生、宿舍三大项为基础的信息管理系统,早检、晨跑、卫检及相应…

ASFormer:Transformer for Action Segmentation论文阅读笔记

摘要 为了解决动作分割类问题&#xff0c;作者设计了一个高效的基于transformer的动作分割任务模型&#xff0c;ASFormer&#xff0c;该模型具有以下三个特征&#xff1a; &#xff08;i&#xff09;由于特征的高局部性&#xff0c;作者明确地引入了局部连通性归纳先验。它将假…