`
pavel
  • 浏览: 930768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

.NET 脚本

阅读更多

简介
你知道我对于前.NET时代有什么留恋吗?脚本!我喜欢创建一个小巧的脚本文件为我完成一些小任务,或者为了测试一小段代码而无需创建一项工程或是解决方案。我喜欢处理和清除的仅仅是一个小巧的文件而不是一个解决方案文件夹,工程文件夹和附带的bin 和obj 文件夹。我怀念那些时光,这正是我创建 .NET 脚本的原因。

什么是.NET 脚本呢?

基本上,它就是一个简单的控制台应用程序,从 .dnml 文件( Dot Net Markup Language, .NET 标记语言, 这是我定义的,哈哈)中读取 XML 文档。这个XML文档包含如下子元素,存储程序集引用,编写的代码所属的语言以及实际的要编译和执行的代码。那个控制台应用程序,我称之为脚本引擎,读取XML 文本并分析出需要的数据。然后它利用CSharp, VisualBasic, 和 CodeDom 命名空间中的类编译代码并将作为结果的程序集装载到内存中。教本引擎利用反射机制执行生成的程序集中的入口函数。当用户关闭控制台窗口时,脚本引擎被关闭,在内存中的程序集将不复存在,它将被垃圾回收器清理掉。没有任何的库或可执行程序生成。

Dot Net 标记语言
让我们来看看.NET 标记语言是什么模样的。它其实非常简单。下面就是一个它的例子。我会一一说明XML 文档中的每个元素。

<dnml>
<reference assembly="System.Windows.Forms.dll" />
<language name="C#" />
<scriptCode><![CDATA[
using System.Windows.Forms;
public class Test
{
   public static void Main()
   {
       Console.WriteLine("This is a test");
       MessageBox.Show("This is another test");
       Test2 two = new Test2();
       two.Stuff();
   }
}
public class Test2
{
 public void Stuff()
 {
  Console.WriteLine("Instance call");
 }
}
]]></scriptCode>
</dnml>
该文档XML元素称为 <dnml> (你能猜出它代表什么吗?)。在这个元素内部有三个不同的子元素,你能用它们来定义脚本如何编译。

首先是 <reference> 元素,它只有一个属性,叫“Assembly”。“Assembly”属性包含你要引用的程序集名称(包含文件扩展名)。一个.dnml 文档可以包含许多<reference> 元素,它对应于你在VS.NET 中向工程中添加的引用列表。 对于每一个你的代码执行所需要的引用,都必须添加一个<reference assembly="" /> 元素。

基于程序集探测的考虑,任何你所引用的GAC 程序集都会被CLR自动找到。但是如果你引用了一个不是GAC中的程序集,情况就不同了。假设你引用了一个称为Common.dll 的非GAC 程序集。为了让您的.NET 脚本正确执行,Common.dll 必须放在两个地方。首先它必须放在你的.dnml 文件所属的文件夹中。其次,它必须放在脚本引擎所在的文件夹中。我正在试图解决这个问题,但是就目前来说非GAC 程序集必须存放在两个不同的文件夹中。

下一个元素是<language> ,它有一个属性,称为 'name'。一个.dnml 文件只能有一个语言元素。对于’name’ 属性两个可能的值是 'C#' 和 'VB', 我希望他们是自描述的。

最后一个元素是<scriptCode> , 它含有一个CDATA XML 元素。这个元素里包含了当你执行该.dnml 文件时将要执行的代码。但是为了使用它你必须遵循一些接口规则。首先,它实际上只是普通的内嵌C# 和 VB.NET, 所有的方法和字段都必须放在类里面。其次,你可以定义任意多个类,但是必须有一个类拥有一个公有静态函数,称为 “Main”, 没有任何输入参数,也不返回结果。只是脚本引擎通过反射搜索到的入口方法;如果找到,将会调用它。当然,“Main”方法放在哪个类中是无关紧要的,因为脚本引擎将会遍历定义的每个类型,直到它找到Main 方法为止。

脚本引擎是怎样工作的?
脚本引擎的大多数代码都是很直观的,因此我会一一描述它的每个方面。当中有一个非常有趣的部分就是一个名为AssemblyGenerator 的类,它只有一个方法,称为CreateAssembly()。这个方法将完成所有的工作,编译并生成一个新的程序集,正如下面所看到的.

//Create an instance of the C# compiler  
CodeDomProvider codeProvider = null;
if (code.IsCSharp)
   codeProvider = new CSharpCodeProvider();
else
   codeProvider = new VBCodeProvider();
ICodeCompiler compiler = codeProvider.CreateCompiler();
首先我需要声明一个类CodeDomProvider 的实例。它是类 CSharpCodeProvider 和类VBCodeProvider 的基类。你可以使用这些语言的特定 XxxProvider 对象来创建一个 CodeGenerator 对象,它将被用来根据它包含的你创建的CodeDom 对象图生成代码。你可以创建一个CodeParser 对象,它将根据你传入的源代码字符串生成一个CodeDom 对象图(在当前1.1 .NET Framework 版本中, 它将返回空值) 。XxxProvider 对象也可以用来创建一个CodeCompiler , 这正是我这里所使用的。 CodeCompiler 类就是我用来编译.dnml 文件中的代码,并生成新的程序集的类。

所以,基于.dnml 文件中所定义的语言类型,我创建一个合适的XxxCodeProvider 对象。从这个对象,我请求一个CodeCompiler 实例,它将是基于语言不同而不同的。

//add compiler parameters
CompilerParameters compilerParams = new CompilerParameters();
compilerParams.CompilerOptions = "/target:library /optimize";
compilerParams.GenerateExecutable = false;
compilerParams.GenerateInMemory = true;
compilerParams.IncludeDebugInformation = false;
compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
compilerParams.ReferencedAssemblies.Add("System.dll");
  
//add any aditional references needed
foreach (string refAssembly in code.References)
   compilerParams.ReferencedAssemblies.Add(refAssembly);
下一步,我创建一个CompilerParameters 对象。这个类基本上包装了当你手工通过csc.exe (C# 编译器) 和 vbc.exe (VB.NET 编译器) 编译一个程序集时所用的所有命令行参数。一个特别重要的参数就是属性GenerateInMemory,  这里我用到了它。它能确保当代码编译时,生成的程序集只会驻存在内存中,而不会作为结果创建任何文件。

该代码的最后一部分将脚本代码所需要的所有引用添加到CompilerParameters中。 默认情况下,我添加了对于mscorlib.dll 和 system.dll 的引用。然后我添加了对于.dnml 文件中每一个<reference> 元素所标明的程序集的引用。

//actually compile the code
CompilerResults results = compiler.CompileAssemblyFromSource(
                             compilerParams,  code.SourceCode));
//Do we have any compiler errors
if (results.Errors.Count > 0)
{
   foreach (CompilerError error in results.Errors)
      DotNetScriptEngine.LogAllErrMsgs("Compine Error:"+error.ErrorText);
   return null;
}
然后,我调用了CodeCompiler.CompileAssemblyFromSource, 它传入CompilerParameters 对象和包含所要编译的实际代码的字符串变量。返回的对象属于类CompilerResults. 当编译出现错误时,这个对象包含一个CompileError 对象的集合,我将用它显示给用户当编译时那些地方出错了。

//get a hold of the actual assembly that was generated
Assembly generatedAssembly = results.CompiledAssembly;
//return the assembly
return generatedAssembly;
}
如果脚本代码编译成功,CompilerReslts 对象将包含一个对于新编译和创建的程序集的引用。我保留该对象并返回给调用方法。

一旦程序集成功创建并返回,脚本引擎将利用反射遍历每一个生成的类型,寻找一个叫'Main' 的静态方法。如果找到了,就再次利用反射执行它。如果没有找到,它将返回给用户一个错误,用来解释发生的问题。

最后一步
.NET 脚本引擎还能够添加和删除.dnml 文件的关联。这意味着一旦文件关联好,你为了执行.dnml 文件只需双击它就可以了。 当你做个时,脚本引擎将会执行,一个相关路径的命令行参数和该 .dnml 文件名将传递给它。接着教本引擎将读取该文件并处理相应的XML。

为了创建.dnml 文件和.NET 脚本引擎之间的关联,你只需双击DotNetScriptEngine.exe 就可以了。当它不带任何命令行参数执行时,它将在您的服务器上创建文件关联。如果你在控制台运行DotNetScriptEngine.exe, 并传入'remove' 参数,该引擎将会在您的服务器上删除文件关联。

翻译的 http://www.codeproject.com/KB/dotnet/DotNetScript.aspx

分享到:
评论

相关推荐

    Python项目-实例-02 代码雨.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测(含完整的程序,GUI设计和代码详解)

    内容概要:本文介绍了使用 Matlab 实现 SO-CNN-SVM 框架进行多输入单输出回归预测的全过程。该框架利用蛇群优化算法(SO)优化卷积神经网络(CNN)和 支持向量机(SVM),实现高效的特征提取和回归预测。文章详细描述了数据预处理、模型构建、SO算法优化、模型训练、可视化和 GUI 设计的步骤,并提供了完整的代码示例。 适合人群:具备一定机器学习和深度学习基础,熟悉 Matlab 编程的研究人员和开发人员。 使用场景及目标:① 工业制造中的设备故障预测和质量控制;② 金融分析中的市场价格预测和风险管理;③ 环境监测中的气候变化和空气质量预测。该框架的目标是提高预测精度,优化模型参数,缩短训练时间,增强模型泛化能力。 阅读建议:本文不仅详细介绍了理论背景和技术细节,还提供了实际操作的代码和 GUI 设计思路,建议读者在阅读过程中结合实际数据和代码进行实验,以更好地理解和掌握相关技术。

    Java系统源码+社区养老服务系统

    Java系统源码+社区养老服务系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    Java系统源码+健身房管理系统

    Java系统源码+健身房管理系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    阵列信号处理-MUSIC算法-均匀线阵-幅相误差-信噪比变化

    阵列信号处理中,均匀线阵条件下,分析不同信噪比条件下,幅相误差对于测向角度偏差的影响

    Python项目-游戏源码-07 坦克大战.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    Python项目-实例-04 简易时钟.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    瓶罐检测26-CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    瓶罐检测26-CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rarDetectResiduos-V1 2024-02-24 3:32 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括6821张图像。 工具以创建格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: *水平翻转的50%概率 *垂直翻转的50%概率 * -15和+15度之间的随机旋转 * 0到1.5像素之间的随机高斯模糊

    名片管理系统.pdf

    名片管理系统.pdf

    瓶子检测3-YOLOv9数据集合集.rar

    瓶子检测3-YOLOv9数据集合集.rarMY_DATASET11-V1 2022-12-28 1:46 AM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括1001张图像。 塑料 - 玻璃金属纸纸以yolov9格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整到224x224(拉伸) 没有应用图像增强技术。

    水瓶瓶罐检测58-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    水瓶瓶罐检测58-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rarQaldyq Suryptau-V2 2024-02-26 8:05 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括2328张图像。 以可可格式注释了金属 - 柔性 - plastmassa-qaldyq。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为416x416(拉伸) 应用以下扩展来创建每个源图像的3个版本: *随机裁剪图像的0%至10% * -15和+15度之间的随机旋转 *随机的BRIGTHNESS调整-10%至+10% * -7%至 +7%之间的随机暴露调整

    Python项目-自动办公-05 在Excel表格中将上下行相同内容的单元格自动合并.zip

    Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

    基于ssm的精品酒销售管理系统+jsp源代码(完整前后端+mysql+说明文档+LW).zip

    使用精品酒销售管理系统的用户分管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有:主页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等。 用户可以实现主页、个人中心、我的收藏管理、订单管理等。 前台首页可以实现商品信息、新闻资讯、我的、跳转到后台、购物车等。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    1_io_thread_1734442494401.wmv

    1_io_thread_1734442494401.wmv

    一个基于Java Web的在线问卷调查系统源码实例

    java 一个基于Java Web的在线问卷调查系统源码实例 一个基于Java Web的在线问卷调查系统源码实例

    基于ssm的在线项目众筹平台源代码(完整前后端+mysql+说明文档+LW).zip

    网站前台注重的功能实现包括会员注册、系统公告、项目查看、在线留言、关注收藏项目、众筹项目申请,网站后台注重的功能实现包括系统用户管理、用户注册审核、项目类别管理、项目信息管理、投资申请查看、投资申请审核、申请结果反馈。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    毕业设计的概要介绍与分析

    以下是一个关于毕业设计的资源描述和项目源码的简要概述: 资源描述 该毕业设计项目为一个基于Spring Boot的在线学习系统。该项目使用了丰富的资源来确保项目的顺利完成。首先,通过数字图书馆和在线数据库(如谷歌学术)获取了大量的相关文献和最新研究成果,为项目的理论基础提供了坚实的支撑。其次,参考了一些电子书籍和国内外教程资源,学习了相关的开发技巧和最佳实践。此外,项目还利用了Spring Boot、MyBatis等开源框架,以及MySQL数据库,这些资源大大提高了开发效率和系统的稳定性。 在开发过程中,还参与了线上和线下的技术培训和研讨会,与其他开发者交流经验,解决了一些技术难题。这些活动不仅提供了宝贵的学习机会,还帮助更好地理解了项目的需求和实现方式。 项目源码概述 该项目源码主要包括以下几个部分: 后端代码:基于Spring Boot框架,实现了用户管理、课程管理、在线学习、模拟考试等功能。 前端代码:使用HTML、CSS和JavaScript(可能使用Vue.js或React.js)等技术,构建了友好的用户界面,使用户能够方便地浏览课程、进行在线学习和考试。 数据库脚本

    xshell与xftp插件

    如果在运维环境中,尤其是乙方,甲方客户为了安全一般不允许上传破解/绿色版等运维软件,这时候如果有官网下载的运维工具且是免费的,那不就可以正常使用了。 8款软件,显示版本到6,以后可不可以不清楚,现在我用绿色版用不上这个。 包含:xfile、xftp、xlpd、xmanager、xmanager 3d、xmanager powersuite、xshell、xshell plus

    广东省深圳市公司申请助理级职称的主要步骤

    广东省深圳市公司申请助理级职称的主要步骤

    杂货产品检测43-YOLO(v5至v9)、CreateML、Paligemma、TFRecord、VOC数据集合集.rar

    杂货产品检测43-YOLO(v5至v9)、CreateML、Paligemma、TFRecord、VOC数据集合集.rarIPCV分配-V6 2024-01-21 6:10 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括7012张图像。 家庭废物以createMl格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。

Global site tag (gtag.js) - Google Analytics