65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 脚本: 缺失的拼图

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (174投票s)

2004 年 10 月 26 日

MIT

24分钟阅读

viewsIcon

1362152

downloadIcon

9509

一篇关于 C# 语言“脚本引擎”的文章

请注意,2014 年 CS-Script 已在更宽松的 MIT 许可证下重新发布,源代码和发布仓库现托管在 CodePlex 上。

CodePlex 还托管了 CS-Script 专用的基于 Notepad++ 的 IDE CSScript.Npp

摘要

本文描述了一个 C# 语言的脚本引擎。以下是所提出的脚本系统的一些主要特性

  • 基于功能齐全的 C#
  • 完全访问 CLR 和 CTS
  • 可以与任何版本的 CLR (.NET 1.1/2.0-3.5) 运行,甚至可能与未来的版本一起运行
  • 通过在此应用程序中托管脚本引擎,可以“脚本化”任何 CLR 应用程序的功能
  • 与常见 IDE 和调试器集成
  • 与操作系统集成
  • 提供全面的文档,例如本地和在线帮助、教程、示例

引言

存在一些非常特殊的编程任务,在传统开发场景中完成这些任务需要付出巨大的努力

design -> coding-> compiling -> application

另一方面,通过使用脚本语言可以非常成功地完成它们。脚本在以下情况下非常有用

  • 开发环境是多变的:预计会频繁修改代码
  • 应用程序逻辑简单:应用程序仅用于非常特定的独立任务
  • 知识产权保护不是问题:源代码是开放的
  • 维护和部署要求非常严格:软件解决方案最好只包含一个文件,并通过简单复制最少数量的文件进行部署
  • 开发速度预计比平时更快:代码由相对较大的块组成

本文介绍了一个我为简化开发配置、测试环境、自动化构建过程、自动化测试和收集测试结果等任务而实现的 C# 语言脚本引擎。这些都是我作为一名活跃的 C#/C++ 程序员通常不喜欢做的事情。

最新更新

C# 脚本项目(产品名称 CS-Script)已经超出了单篇文章的范围。它拥有自己的受众,并已应用于许多商业和非商业产品。例如,MediaPortalFlashDevelopK2 API 或 sourceforge.net 上的“WinTin”和“C# Script”项目。本文描述的 CS-Script 版本是 v1.1.0。然而,目前可用的 CS-Script 版本 (v2.5.0) 具有一些我在撰写本文时无法预见的特性。其中许多特性都是 CS-Script 用户反馈的结果。其中一些特性极大地改变了 CS-Script 的形态

  • 能够动态生成运行时可调用包装器、WebService、Remoting 和 WCF 代理,无需开发人员参与。这使得 CS-Script 成为一个非常动态的运行时环境,同时保持其静态类型性质
  • 使用目标系统上任何可用的 CLR 调试器调试 C# 脚本的极其简单的方法
  • 支持其他编程语言,例如 C++/CLI、VB.NET、J# 和无类 C#
  • 非常简单的脚本托管模型(从任何 CLR 应用程序托管脚本引擎)
  • 真正的鸭子类型(DuckTyping),允许将脚本类与主机应用程序中定义的接口对齐。
  • 在托管场景中,能够基于仅包含方法定义的脚本发出极快的委托

无论如何,我鼓励您阅读本文,因为它解释了 C# 脚本的目的和内部原理。我还建议您从 CS-Script 主页下载二进制文件。以下是最新版本的一些更改和特性列表,这些更改和特性不在文章下载中,但存在于当前版本中

  • 支持自定义 CLR 编译器。VB.NET 和 JScript 编译器作为默认 CS-Script 安装的一部分安装 (v1.3.0)
  • 简化以下任务的配置控制台 (v1.3.0-1.3.1)
    • 启用特定 IDE/调试器 (Visual Studio 2003/5/8, Visual Studio 2005/8 Express, CLRDebugger, SharpDevelop)
    • 选择系统上安装的目标 CLR 版本
    • 启用 CS-Script shell 扩展
    • 检查更新、发送反馈以及访问本地和在线文档
  • 支持无类 C# 脚本 (v1.5)
  • 能够执行预/后执行脚本 (v1.5)
  • COM 和 Web 服务“单行访问”(无需导入类型库或运行 wsdl.exe)(v1.5)
  • 将 C# 脚本转换为 Web 服务 (v1.5)
  • CS-Script 自动更新 (v1.5)
  • 命令行开关 //x(类似于 VBScript 中使用的开关),用于在目标系统上任何可用的 CLR 调试器下执行 C# 脚本 (v1.6)
  • 脚本引擎启动器 css.exe,允许在脚本不进行任何控制台输出的情况下,在不显示控制台窗口的情况下运行控制台脚本 (v1.6)
  • 对 Compact Framework 的有限支持 (v1.7)
  • 可配置(基于批处理文件)高级 Shell 扩展 (v1.8)
    • 在 Visual Studio 中打开脚本文件
    • 运行脚本
    • 在调试器下启动脚本
    • 检查脚本文件是否存在语法错误
    • 启动配置控制台
    • 将脚本转换为 Visual Studio 2005 项目
    • 将脚本转换为 Visual Studio 2008 项目
    • 为脚本文件创建快捷方式,以便通过双击运行它
    • 将脚本编译成可执行文件
    • 将脚本编译成类库
  • 支持 C++/CLI 语法 (v1.9)
  • 支持 WPF/XAML 脚本 (v1.9)
  • 脚本库中的示例脚本(Remoting、WCF、WPF、WWF)(v1.9-2.1)
  • 支持脚本探测目录 SearchDirs。此功能类似于系统环境变量 PATH。还实现了 SearchDirs 控制台,用于简单管理 SearchDirs 项目 (v1.9-2.0)
  • Vista 支持。实现了脚本执行的进程提升 (v2.0)
  • 用于从应用程序托管脚本引擎 (CSScriptLibrary.dll) 的脚本缓存算法 (v2.0)
  • “脚本别名”的概念。脚本别名是一个“类似脚本”的文件,它链接到实际的脚本文件。脚本别名是 Windows 中文件快捷方式的逻辑等效项 (v2.0)
  • 简化的托管模型:脚本和主机之间不受限制的双向通信,无需任何设置成本 (v2.1)
  • 支持 C++ 风格宏。CS-Script 扩展了其在运行时动态生成代码的能力,并允许在 C# 代码中定义 C++ 风格宏 (v2.1)
  • 完整的 Visual Studio 集成,包括工具栏按钮/命令和代码片段库 (v2.1)
  • 当从托管应用程序托管脚本引擎时,支持仅加载方法定义(无类脚本)(v2.2)
  • 由于使用了发出的动态委托,性能显著提升(在托管脚本引擎时)(v2.2)
  • 简化了调用动态加载程序集方法的语法。类似于 C# 4.0 动态 (v2.2)
  • 添加了交互式环境 CSI (v2.3)
  • 支持从脚本和/或命令行指定探测目录 (v2.3)
  • 支持所有导入/包含脚本指令中的可扩展环境变量 (v2.3)
  • 添加了详细执行模式,允许在脚本执行期间分析运行时信息 (v2.3)
  • 通过 /autoclass 指令添加了对无类脚本文件的原生支持 (v2.4)
  • 实现了脚本中定义并在主机应用程序中实例化的类的接口对齐(鸭子类型)(v2.4)
  • 添加了适用于 Linux 的 CS-Script 启动器 (v2.4)cs-script_for_cp/New.gif
  • 添加了与 NAnt 的集成 (v2.5)cs-script_for_cp/New.gif
  • 添加了 Silverlight 播放器,用于查看 XAP 文件并将 Silverlight Web 应用程序转换为自给自足的桌面应用程序 (v2.5)cs-script_for_cp/New.gif
  • 更新了 Linux 相关实现模块。现在 C# 和 VB.NET 脚本可以在 Linux 上通过简单的双击运行 (v2.5)cs-script_for_cp/New.gif

背景

微软没有提供许多足够的脚本解决方案。VBScript 是他们期望用于脚本的语言。尽管通过创建 COM 组件可以中等程度地扩展 VB 功能,但其原生功能极其有限,并且语法概念设计得很糟糕。我相信很多人都清楚使用 VBScript 时的糟糕体验。当 .NET 出现时,我期望 C# 语言的脚本引擎能解决这个问题。然而,这并没有发生。微软没有为 WSH 提供 C# 引擎。MSDN 中给出的理由是:

脚本与 .NET 关系不大,原因有二。首先,WSH 完全依赖于 COM。其次,.NET 语言相对于脚本语言在性能和编程便捷性方面具有显著优势。

微软只为 .NET 提供了三个脚本引擎:旧版 VBScript、旧版 JScript 和 .NET 中间语言 (IL)。我不知道为什么没有 C#。许多开发人员需要一个强大的脚本语言,不是因为它是否适合某个现有软件概念,而是因为我之前提到的所有原因。总结一下,这些是简单快速开发、频繁更改、轻松维护和部署的需求。我认为缺少 C# 脚本引擎是微软的一个营销失误。

当我第一次看到 Python 时,我非常兴奋。终于,有了一个强大而灵活的脚本解决方案。以下是一些“难以匹敌”的 Python 特性:

  • 语言非常丰富
  • 可以预编译并避免“即时”编译
  • 能够进行 GUI 开发
  • 可以创建对象(是的,它是一种面向对象语言)
  • 可以通过使用相同的语言开发模块来扩展
  • 可移植

我使用 Python 的时间越长,就越希望 C# 也能有类似的东西。这个想法一直在酝酿。在网上浏览时,我遇到了一些解决这个问题的尝试。其中一些相当成功(CodeProject 上有几篇关于这个主题的文章),但是我看过的每个 C# 脚本解决方案要么是基于代码中使用一些非 C# 语法元素,要么需要一个额外的自定义格式文件来存储一些额外信息(例如引用的程序集)。但我想要一个能够执行“纯粹”C# 代码的脚本引擎。

一直以来,我感觉可以使用纯 C# 作为脚本语言。其中一个原因是,在 CLR 下运行应用程序与在脚本引擎下运行脚本非常相似。在这两种情况下,执行都发生在运行时系统下,并且在这两种情况下,都会进行语言解释。关于 .NET Framework 的另一个有趣之处是,C# 编译器可以由应用程序托管。所有这些最终使我能够实现一个 C# 脚本引擎。尽管界面有些相似,但该引擎应用程序与 WSH 毫无关系。

CS-Script 引擎

我不想花太多时间描述脚本引擎应用程序。它的代码是可用的,所以请自行查阅。不过,我还是需要说几句。这种应用程序的设计是直截了当的。脚本执行包括两个步骤:编译和执行。编译部分很简单,一些示例代码可以在这里找到。

更具挑战性的任务是实现所有引用程序集的加载。引用程序集的普遍问题是,仅通过分析代码无法确定它们是什么程序集。微软决定以简单的方式处理这个问题:用户通过将它们添加到特殊的 XML 文件 *.csprj 中来显式指定这些程序集。我不能使用这种方法,因为我决定使用纯粹的 *.cs 文件作为运行脚本的唯一输入文件。

我的方法基于这样一个事实:在现实生活中,程序集名称和根 namespace 之间存在很强的关联。例如,System.Windows.Forms 命名空间在 System.Windows.Forms 程序集中实现。类似地,System.XML 命名空间在 System.XML 程序集中实现。这也适用于程序集文件名,它通常是一个 DLL 文件,与程序集名称相同。

[assembly file name] = [assembly name] + .dll

因此,我可以将脚本中的 namespace 解析为程序集。我为全局 (GAC) 和本地程序集都执行此操作。

[namespace] -> [assembly name] -> [assembly file name]

为了找到全局程序集的位置,需要浏览 GAC。不幸的是,没有可用于在 GAC 中导航的 .NET API,只有 COM API。经过一番研究,问题得到了解决。我要感谢 atoenne (CodeProject)、John Renaud (CodeProject) 和 Junfeng Zhang 撰写的关于使用 GAC 的非常有趣的文章。他们帮了我很多。

处理本地程序集与处理全局程序集一样具有挑战性。我使用基于命名空间的预测程序集文件名算法作为起点。然而,正如我之前提到的,namespace 与程序集名称之间只有关联,没有真正的关系。如果程序集文件名与程序集名称不同,情况可能会变得更加复杂。最重要的是,程序集根 namespace 可能与这些名称中的任何一个都不相似。因此,无法可靠地预测引用了哪个程序集。唯一的方法是对脚本目录(当前目录)中找到的程序集应用反射。

然而,仍然无法保证脚本中的所有 namespace 都能被解析。这就是我提供“后门”的原因:程序集可以作为命令行参数显式指定。我从未使用过此功能,因为到目前为止,我所有脚本中的所有 namespace 总是能被解析。我唯一必须施加的限制是,脚本中引用的任何程序集必须位于 GAC 或与脚本相同的文件夹中。

基本上,脚本执行是这样的:用户运行脚本引擎应用程序并指定一个脚本文件作为参数。脚本文件只是一个定义了 static 方法 Main(...)*.cs 文件。引擎将脚本编译成一个程序集,并执行此程序集中一个众所周知的入口点:Main()。这种脚本系统的优点是显而易见的,我将通过说明这种新脚本系统的一些特性来阐释它们:

  • 简单的部署方法:只需将脚本和引擎文件(大约 30 K 大小)带到安装了 .NET 运行时的系统上,即可运行脚本
  • 可移植性:脚本可以在安装了 CLR 的任何系统上运行
  • 基本语言是真正的面向对象语言:使用功能齐全的 C#。我称之为“C# 脚本”,但实际上它是“C#”。“C# 脚本”更能代表执行性质
  • 所有 .NET 功能都可用(FCL、COM 互操作、远程处理)
  • 易于使用的调试器和丰富的 IDE(Microsoft .NET Studio、CLR Debugger)
  • 脚本内的执行模型与任何 .NET 应用程序相同:static void Main()
  • 任何脚本都可以轻松转换为应用程序,反之亦然
  • 优化的解释:脚本中任何语句的解释只进行一次,即使该语句在整个代码中频繁使用
  • 脚本语言是类型安全的:强类型是大多数脚本语言不具备的奢侈品
  • 对于“铁杆”VB 爱好者,动态类型也可用。只需将 Object 作为默认类型,并始终进行装箱/拆箱
  • 所有软件开发任务都可以使用同一种语言完成
  • 脚本应用程序的 GUI 开发变得容易
  • 可扩展性:可以通过使用任何 .NET 语言或 COM 组件编写的新程序集进行扩展

使用 C# 脚本

我已经使用 CS-Script 进行了一些开发,并发现该系统稳定可靠。以下是脚本引擎应用程序的一些特性:

  • 提供两种接口:WinForms 和控制台应用程序
  • 可以执行定义了 Main() 方法的标准 *.cs 文件
  • 可以将编译后的程序集文件存储在与脚本文件相同的位置;如果脚本自上次执行以来未更改,下次可以直接执行该文件,而无需再次编译脚本
  • 可以生成模板脚本文件作为进一步开发的起点
  • 可以从脚本生成可执行文件。因此,无需脚本引擎即可再次运行它
  • 可以从脚本生成程序集,因此它可以像任何其他类库一样使用
  • 脚本引擎对脚本文件扩展名不敏感。用户可以指定任何文件或不带扩展名的文件名。在这种情况下,将假定为 *.cs
  • 如果脚本文件在当前目录中找不到,脚本引擎会在 PATH 环境变量指定的目录中查找它

根据用户需求添加的功能

  • 脚本引擎可以由任何 CLR 应用程序托管。作为下载包的一部分,提供了一个将脚本引擎实现为类库的程序集
  • 脚本引擎可以加载多个脚本。当一个脚本使用另一个脚本的功能时,这非常有用
  • 显式引用的程序集不仅可以从命令行添加,也可以直接从代码中添加

脚本引擎应用程序在 WinForms 模式下名为 cscscript.execswscript.exe。准备任何脚本最简单的方法是从命令行执行它:

cscscript /s > Sample.cs

这将在当前目录中生成 Sample.cs 文件。Sample.cs 是一个 C# 源文件。您需要向此文件添加有效的 C# 代码来完成您的特定任务。之后,它可以通过以下命令由脚本引擎编译和执行:cscscript.exe sample.cs

Sample.cs

using System;
using System.Windows.Forms;
class Script
{
 static public void Main(string[] args)
 {
 MessageBox.Show("Just a test!");
 for (int i = 0; i < args.Length; i++)
 {
 Console.WriteLine(args[i]);
 }
 }
}

脚本执行

cs-script_for_cp/ScreenSh.jpg

再次强调,脚本文件包含普通的 C# 代码。没有一个语言语句是只有脚本引擎才能理解,而任何 C# 编译器(Microsoft .NET Studio)都无法理解的。这是 CS-Script 最强的优点之一:

C# Script 不是 C# 的另一种变体。它是 C#,只是编译和执行方式不同。

任何脚本文件也可以使用 .NET Studio 打开、编译和调试,因为它只是 C#。我不得不说,我在这项工作的开始时所获得的超出了我的预期。脚本引擎只是一个应用程序,而且是一个相对原始的应用程序。然而,它的功能可以通过脚本进行扩展。该系统的主要目的是执行可以通过其他脚本改进的脚本。这听起来可能很奇怪,但事实确实如此。这样的脚本可以:

  • 安装脚本引擎(发布到 EnvVar PATH 中)
  • 将任何脚本文件插入预定义的 C# 项目中,并在 .NET Studio 中打开。因此,它已准备好在调试器下运行
  • 创建 shell 扩展,只需右键单击鼠标即可在 .NET Studio 中运行或打开任何脚本文件。如您所见,同一个脚本引擎应用程序现在功能更强大了
  • 从代码片段动态编写 C# 脚本并执行,例如 cscscript code MessageBox.Show("Just a test!") 将弹出消息 "Just a test!"

如您所见,同一个脚本引擎应用程序现在功能更强大了。

CS-Script 包

您可以从本页顶部或我的网页下载整个 CS-Script 包,其中包含脚本引擎、有用的脚本和示例。要安装,您需要从 ZIP 文件中解压所有内容并执行 install.bat。当然,.NET Framework 必须首先安装。安装后,您的环境变量将更新,并且所有 shell 扩展都将创建。严格来说,不需要安装。脚本引擎应用程序是自给自足的,下载后即可立即运行。安装期间执行的唯一操作是调整操作系统环境,以使脚本尽可能方便。以下是我创建并添加到包中的一些非常简单的脚本列表:

  • NKill.cs - 终止作为命令行参数指定的进程
  • GetUrl.cs - 获取 URL 内容并将其保存到文件中。可以处理代理身份验证
  • Debug.cs - 用临时 C# 项目打开脚本,以便在调试器下运行
  • Install.cs - 安装/卸载 CS-Script shell 扩展,允许通过鼠标右键运行/调试任何脚本
  • ImportData.cs - 将指定文件中的数据导入 SQL Server 表
  • ExportData.cs - 将数据从 SQL Server 表导出到指定文件
  • RunScript.cs - 在后台运行另一个脚本,并将输出重定向到父脚本的脚本
  • Tick.cs - 简单的脚本,计算指定秒数;用作 RunScript 的演示
  • SynTime.cs - 从这里获取时间并同步 PC 系统时间
  • MailTo.cs - 向指定地址发送电子邮件
  • Reflect.cs - 打印程序集反射信息
  • Creditentials.cs - 提示并收集用户登录信息
  • GetOptusUsage.cs - 检索每月数据使用情况。这仅适用于“Optus Australia”客户
  • Interop.cs - 创建和访问 COM 和 CLR 对象
  • ImportTickScript.cs - 使用 import 指令导入并执行 tick.cs 脚本
  • Client.cs Script.cs Common.cs - 使用 CS-Script 脚本扩展任何应用程序的示例
  • 还有其他...

关注点

以前,我的硬盘上有大约一百个 C# 项目。大多数情况下,这些项目只包含大约 100-200 行代码,只是为了测试某个算法或 MSDN 中的代码示例。现在,对于任何编码练习,我只有一个 *.cs 文件。我只需右键单击它,它就会在 .NET Studio 中并准备就绪。这太方便了!脚本还有另一点我真的很喜欢。开发和测试现在可以用同一种编程语言完成。下面是一个简单的例子:

你需要测试你的程序集,例如,它执行打印功能。在运行时条件下,该程序集由主应用程序使用。但是,你需要打印一千次才能获得一些统计数据。如果从主应用程序中进行,意味着用测试代码污染主应用程序。你可以做的是将调用程序集的主应用程序代码复制到 *.cs 文件中,并使用脚本引擎运行它。在这种情况下,程序集在与运行时相同的条件下进行测试,并且测试设计更加优雅。

因此,脚本引擎与脚本结合,就成为一个小型的开发系统。

结论

C# 脚本不应与传统的 C# 开发竞争。它们服务于完全不同的目的。C# 脚本仅仅是 .NET 家族中缺失的东西,是本文标题中的“缺失的拼图”。我很想知道其他人怎么看,并会感谢任何反馈。

反馈

我要感谢所有向我提出建议和想法的人。其中一些已在当前版本的脚本引擎中实现。最常见的问题之一是关于托管脚本引擎。我偶然发现了一个论坛,我因为低估脚本托管的重要性而受到批评。我想他们是对的。尽管从很早的版本(Math.csMathClient.cs 示例)开始就存在托管脚本引擎的技术可能性,但许多用户希望托管更简单、更直接。根据用户的要求,我实现了全面的脚本引擎托管。所有可能的托管场景都在此处描述。简而言之,托管将涉及:

  • 将脚本编译成程序集,即通过脚本引擎生成脚本程序集
  • 将脚本程序集加载到相应的 AppDomain
  • 使用脚本程序集中实现的对象

我在 CSScript 类 (CSScriptLibrary.dll) 中添加了两个方法:

  • Load - 将脚本编译成程序集并将其加载到当前 AppDomain 中。返回加载的程序集对象
  • Compile - 将脚本编译成程序集并返回程序集文件名。因此,该程序集可以加载到任何 AppDomain

所有这些都允许简单的脚本托管,主机和脚本之间可以不受限制地进行数据交换,只需几行额外的代码即可。请参阅 Client.csScript.csCommon.cs 示例。

有一些非常有趣的建议,我没有以它们被提出的方式实现。我将通过一个例子来解释。有一个建议是让脚本引擎接收一个 C# 语句并执行它,而无需实际编写脚本。这个想法很好,但我不想将这种功能放入脚本引擎中。我认为引擎应该是一个简单、可靠和自包含的应用程序,不应功能过载。只有这样它才能健壮稳定。我不想每次决定以不同方式执行脚本时都修改它。我认为所提出的脚本系统可以通过其他脚本和程序集进行扩展,而不是通过重新实现引擎。这样,脚本引擎将免受系统中任何更改的影响。这就是为什么我将建议的功能实现为脚本(code.cs)。因此,在不更改脚本引擎的情况下实现了目的。以下是如何使用此脚本的示例:

cscscript code MessageBox.Show("Just a test!")

脚本 Samples.cs 以类似的方式实现:

  • cscscript samples: 打印可用示例列表
  • cscscript samples mailto myMailto.cs: 将“mailto”示例的内容保存到 myMailto.cs 文件中
  • cscscript samples 1 myScript.cs: 将示例 #1 的内容保存到 myScript.cs 文件中

还有另一个建议是在指定的安全上下文中运行脚本。这可以使用相同的方法实现。例如...

cscscript runas sa:sysadmin myScript

...以用户 sa 和密码 sysadmin 的身份运行 myScript。此外,许多人问我关于运行多个脚本文件的问题。在这种情况下,一个脚本会执行另一个脚本来完成某些工作。我已经实现了这个功能(2005 年 2 月 5 日更新),并且下载已可用。我不得不说,我认为这个功能超出了脚本引擎的最初范围。这是因为,正如我之前提到的,一个需要多个文件的复杂应用程序可以作为传统的 C# 应用程序来实现。因此,没有真正需要使用 CS-Script。然而,从用户的反馈中我看到很多人希望在脚本引擎中看到这个功能。

它的实现方式类似于 C++ 的 #importImport 指令会在运行时将脚本文件合并在一起。因此,一个脚本中的所有代码都可供另一个脚本使用,反之亦然。语法可在帮助消息中找到(“cscscrip.exe /?”)。为了避免命名冲突,导入可以进行可选的 namespace 重命名。有关详细信息,请参阅提供的示例文件 importTickScript.cs

我最近添加了对名为 reference 的新指令的支持。它可用于直接从代码中引用程序集。语法可从帮助中获取。您还可以查看 TeeChartForm.cs 示例。如我之前所述,在某些情况下,namespace 无法解析为程序集名称。这是一个非常罕见的情况,但它确实会发生。例如,如果 Steema.TeeChart namespaceteechart.lite.dll 程序集中实现。为了解决这个问题,这样的程序集可以作为命令行参数提供。在某些情况下可能不方便,因此我实现了 reference 指令以直接从代码中引用程序集。importreference 指令的语法设计旨在使脚本代码 100% 符合 CLS 规范。

再次感谢所有对本项目感兴趣的人。如果您对文章更新之间的热修复感兴趣,可以从 CS-Script 主页 (www.csscript.net) 下载它们。

历史

  • 2004 年 10 月 26 日
    • 初次发布
  • 2004 年 10 月 29 日
    • 脚本文件 (install.cs) 更新以修复安装问题
  • 2004 年 11 月 12 日
    • 添加到文章
      • 程序集解析算法的描述
      • 新功能的描述
      • 反馈部分
    • 可下载项目中的更改
      • 添加了对本地程序集的支持
      • 实现了将脚本编译成 EXE 文件
      • 添加了 CSScriptLibrary 程序集 (CSScriptLibrary.dll),用于 CLR 应用程序托管脚本引擎
      • 脚本引擎应用程序现在已镜像,cscscript.exe/csc.execswscript.exe/csw.exe
  • 2005 年 2 月 5 日
    • 添加到文章
      • 更新了关键字列表和反馈部分
    • 可下载项目中的更改
      • 添加了对运行多个脚本文件的支持
    • 更新了 debug.cs 脚本。它现在能够解析代码中所有引用的 namespace 或对其他脚本的引用,并生成相应的 Visual Studio 项目
  • 2005 年 6 月 10 日
    • 添加到文章
      • 更新了反馈部分
    • 可下载项目中的更改
      • 添加了从代码中引用程序集的支持
      • 更新了 debug.cs 脚本。它现在能够将代码中引用的程序集添加到相应的 Visual Studio 项目
  • 2005 年 7 月 20 日
    • 添加到文章
      • 更新了反馈部分
    • 可下载项目中的更改
      • 添加了对 .NET 2.0 Framework 的支持
      • 改进了对脚本托管的支持
      • 添加了对 Visual Studio 8.0、SharpDevelop 和 Microsoft CLR Debugger 的支持
  • 2005 年 8 月 16 日
    • 可下载项目中的更改
      • 修复了阻止安装 Visual Studio 2005 shell 扩展的错误
      • 添加了对脚本中 [STAThread][MTAThread] 属性的支持
      • 添加了一些新的示例脚本
  • 2005 年 10 月 27 日
    • 在文章开头添加了更新描述 (v 1.2)
  • 2007 年 5 月 25 日
    • 文章更新。
  • 2007 年 7 月 19 日
    • 文章和下载已更新
  • 2008 年 4 月 8 日
    • 文章更新。
  • 2009 年 2 月 28 日
    • 文章更新。
  • 2009 年 6 月 22 日
    • 文章更新。
  • 2009 年 9 月 29 日
    • 文章更新。
© . All rights reserved.