.Net 脚本编辑器 (C#, VB.NET Mini IDE)






3.93/5 (44投票s)
此处发布的源代码/文章旨在提供 MS Script 控制的功能(例如 AddObject 函数)以及 VSA/Visual Studio 编辑器的一些功能,如智能感知、代码补全等。
为您的应用程序添加脚本功能,提供 MS Script 控制(例如 AddObject 函数)的功能以及 VSA/Visual Studio 编辑器的一些功能,如智能感知、代码补全等。单一 WinForm 控件的 Mini .Net IDE。

引言
此控件的实际需求是在我的应用程序中构建脚本功能,就像所有 Microsoft Office 应用程序(VBA)中可用的功能一样,它是 Microsoft 产品 VSA(Microsoft Visual Studio for Applications)的替代品。
此处发布的源代码/文章旨在提供 MS Script 控制的功能(例如 AddObject 函数)以及 VSA/Visual Studio 编辑器的一些功能,如智能感知、代码补全等。该控件支持 C# 和 VB.net 语言,但可以轻松修改以支持任何 .net 语言。您可以使用 COM 引用、.Net 引用和 Web 引用。该控件支持 Visual studio IDE 的功能,如书签、突出显示解释器错误和编译器错误、添加多个类和接口。您可以想象一个内置单一控件的 Visual studio IDE,并具有 MS Script Control 的 AddObject 等功能。要使用此控件,只需将其拖放到您的 winforms 中,然后添加几行代码即可添加您希望在脚本中访问的对象实例。
VSA 历史
此控件的实际需求是在我的应用程序中构建脚本功能,就像所有 Microsoft Office 应用程序(VBA)中可用的功能一样,它是 Microsoft 产品 VSA(Microsoft Visual Studio for Applications)的替代品。
许多开发人员正在寻找脚本解决方案,并且对 Microsoft 未能在 .Net 框架中提供任何等同于 Microsoft 脚本控制器的功能感到非常失望。脚本控制器具有一些非常好的功能,如 AddObject,它允许您在运行时将对象实例添加到脚本引擎中,脚本可以访问它。有关使用 MS Script 控制器和智能感知的 VBScript 编辑器的更多详细信息,请查看我之前在 planet source code 上发布的 文章。
一些开发人员尝试使用 .net 互操作来使用 MS Scripting 控制器,但并非所有功能都可用,而且它相当不稳定。AddObject 方法不能用于访问 .net 对象。
Microsoft 已用 VSA(Visual Studio for Applications)取代了 VBA(Visual Basic for applications)。VSA 命名空间在 .net 2.0 之前的版本中可用,不幸的是,vsa 命名空间现在已过时(在 .net 2.0 及更高版本中)。
Microsoft 发布了独立产品“Microsoft Visual Studio for Applications”,用于为您的应用程序添加脚本功能,例如 VBA。但是,您现在可以在 VSA 编辑器中使用 C#、vb.net 等。VSA 随 SQL server 2005 Integration services (SSIS) 一起提供,这是 DTS(SQL Server 2000)的另一个名称。在设计 SSIS 中的包时,您可以使用 VSA 编辑器编写 .Net 代码。如果您想在产品/应用程序中使用此产品 (VSA),则需要购买它。
使用代码
注意:ScriptControl 的完整源代码已发布在 sourceforge.net 上,而用于测试该控件的包装器项目(及二进制文件)仅发布在 code project.com 上。
此处发布的源代码/文章旨在提供 MS Script 控制的功能(例如 AddObject 函数)以及 VSA/Visual Studio 编辑器的一些功能,如智能感知、代码补全等。该控件支持 C# 和 VB.net 语言,但可以轻松修改以支持任何 .net 语言。您可以使用 COM 引用、.Net 引用和 Web 引用。该控件支持 Visual studio IDE 的功能,如书签、突出显示解释器错误和编译器错误、添加多个类和接口。您可以想象一个内置单一控件的 Visual studio IDE,并具有 MS Script Control 的 AddObject 等功能。要使用此控件,只需将其拖放到您的 winforms 中,然后添加几行代码即可添加您希望在脚本中访问的对象实例。
当您编译脚本时,它将生成 AIMSScript.dll 程序集,其中包含您编译的 .net 代码。当您单击执行按钮时,程序集将被加载到单独的 AppDomain 中并在那里执行,然后该 AppDomain 将被完全卸载,因为无法从 AppDomain 中卸载单个程序集。
在 sourceforge.net 上发布的 源代码 包含以下子项目:
1. 脚本控件
描述:主控件,可在单一窗口控件中提供类似 Visual Studio 的 IDE。它使用以下所有组件来实现功能。自动列表窗口、代码编译功能、智能感知功能、com、.net 和 Web 引用功能等都已在此控件中实现。它基于 SharpDevelop 开源 C# IDE 的库。
2. 脚本引擎
描述:这是一个控件,用于在单独的 App Domain 中执行由脚本代码生成的程序集,并将退出代码返回给调用程序。它使用 IRun Interface(属于 ScriptRun 项目(如下所述))进行跨 App Domain 通信。
3. 脚本运行
描述:此项目公开 IRun 接口和 ScriptInstance(派生自 MarshalByRefObject)类,用于通过 remoting 与跨 App Domain 进行通信。
4. 代码编辑器
描述:代码编辑器控件是您编写代码的控件。它使用 syntaxdocument 在编辑器窗口中实现代码着色。
语法高亮支持库基于 Fireball.CodeEditor。代码编辑器控件的完成窗口、洞察窗口等功能/概念源自 SharpDevelop 开源项目。
5. SyntaxDocument
描述:SyntaxDocument 项目是 DOM 实现,用于为各种语言支持代码着色。该库基于开源项目 Fireball.CodeEditor。
6. SyntaxFiles
描述:项目程序集持久化各种语言的颜色规则。它支持 C#、CPP、CSS、Delphi、Fortran、foxpro、HTML、Java、Lotus Script、PHP 等多种语言的语法文件。每个语法文件都以 XML 格式保存特定语言的颜色编码规则,可以通过 CodeEditorSyntaxLoader 类应用于 CodeEditor 控件。该库基于开源项目 Fireball.CodeEditor。
7. 停靠
描述:停靠库提供 GUI 控件,如自动隐藏条、停靠窗格、停靠窗口等,并基于开源项目 dockpanelsuite 和 Fireball.CodeEditor 的库。
8. Test – 测试控件的项目
描述:这是启动项目,包含一个用于托管脚本控件和引擎控件的窗体。以下代码用于链接脚本控件和引擎控件。
public Main ()
{
InitializeComponent();
scriptControl1.AddObject("Container", this);
scriptControl1.StartEditor();
scriptControl1.Execute += new EventHandler(scriptControl1_Execute);
}
void scriptControl1_Execute(object sender, EventArgs e)
{
try
{
engine1.OutputAssemblyName = scriptControl1.OutputAssemblyName;
engine1.StartMethodName = scriptControl1.StartMethodName;
engine1.DefaultNameSpace = scriptControl1.DefaultNameSpace;
engine1.RemoteVariables = scriptControl1.RemoteVariables;
engine1.DefaultClassName = scriptControl1.DefaultClassName;
object ret = engine1.Execute(null);
MessageBox.Show("Return Code : " + ret.ToString());
}
catch
{
}
}
关注点:AddObject 功能
请注意,scriptControl1.AddObject("Container", this); 代码是将父窗体的实例添加进去,以便脚本可以通过名称 "Container" 访问它。如果您输入类似 Container.Text = "Hi"; 的代码,它将更改父窗体的标题。
为了实现 AddObject 功能,使用了以下隐藏在 Program.sys 文件中的代码:此类派生自 MarshalByRefObject 并实现
#region System Generated Source Code.Please do not change ...
namespace AIMS.Script
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
public partial class Program : MarshalByRefObject, IRun
{
public static System.Windows.Forms.Form Container = null;
[DebuggerStepperBoundary()]
void IRun.Initialize(IDictionary<string, object> Variables)
{ foreach (string name in Variables.Keys)
{ object value = null;
try { Variables.TryGetValue(name, out value);
FieldInfo fInfo = this.GetType().GetField(name, BindingFlags.Public | BindingFlags.Static);
fInfo.SetValue(this, value);
}
catch (Exception ex)
{
throw ex;
}
}
}
[DebuggerStepperBoundary()]
object IRun.Run(string StartMethod, params object[] Parameters)
{try
{MethodInfo methodInfo = this.GetType().GetMethod(StartMethod, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance);
return methodInfo.Invoke(this, Parameters);
}
catch (Exception ex)
{
throw ex;
}
}
[DebuggerStepperBoundary()]
void IRun.Dispose(IDictionary<string, object> Variables)
{
foreach (string name in Variables.Keys)
{
object value = null;
try
{FieldInfo fInfo = this.GetType().GetField(name, BindingFlags.Public | BindingFlags.Static);
fInfo.SetValue(this, value);
}
catch (Exception ex)
{
throw ex;
}
}
}
}
}
#endregion
在此文章中不可能提供此项目的全部技术实现,但我承诺,如果您对此控件真正感兴趣,我将发布更多信息。您的反馈非常有价值,可以激励我花时间研究此类项目并发布它们,所以请不要忘记留下您的反馈。
进一步增强
1. 支持调试器和断点
- 当前项目仅允许您在 GUI 中标记断点,但您可以使用 debugger.break 函数在任何行中断代码,并且如果您的机器上安装了 .Net,其 .net 调试器将附加到您的程序集。SharpDevelop IDE 支持调试,并且可以在系统中实现。
2. 窗体设计器
- 我的应用程序不需要窗体设计器,因此我没有实现它。但是,您可以实现窗体设计器组件(详情请参阅 SharpDevelop)。
3. 保存选项尚未实现,您可以设计项目文件(XML)的结构及其内容文件。