.NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例

对于Script.NET,我已经写了三篇文章来介绍它,文章汇总如下

.NET 动态脚本语言Script.NET 入门指南 Quick Start

.NET 动态脚本语言Script.NET 开发指南

.NET 动态脚本语言Script.NET 应用举例

希望这三篇文章能帮助你了解Script.NET。 下面的例子,继续讲解它的应用。

 

发送邮件 Send Email

mailObj = new MailMessage("lsh2011@163.com",  "JamesLi2015@hotmail.com","From Script.NET", "Body");
SMTPServer = new SmtpClient("smtp.163.com");
NTLMAuthentication = new System.Net.NetworkCredential("lsh2011@163.com", "password");
SMTPServer.UseDefaultCredentials = false;
SMTPServer.Credentials = NTLMAuthentication;
try
{SMTPServer.Send(mailObj);
}
catch (ex)
{ Console.WriteLine(ex.Message);
}
finally
{
}
 

生成PDF文档 Generate PDF Document

对于PDF文件的操作,选择开源的iText library类库。脚本代码如下所示

//Create document at given location
BeginDocument(“c:\\output.pdf”);//Change title in documentв’s meta dataВ 
ActiveDocument.AddTitle(‘Sample document’);
//Create paragraphs with different alignment and color options
Paragraph(‘Hello World’, ALIGN_CENTER);
Paragraph(‘This is demo’, ALIGN_RIGHT, BLUE);
Paragraph(‘This pdf was generated by S#’, GREEN);
//Create a list of string items
BeginList();ListItem(‘One’);ListItem(‘Two’);ListItem(‘Three’);
EndList();
//Create a table with tree columns
BeginTable(3);
//Create cells for the first row
Cell(’1′);
Cell(‘One’);
Cell(Paragraph(‘Description of One’, RED));
//Create cells for second row
Cell(’2′);
Cell(‘Two’);
Cell(‘Description of Two’);
EndTable();
//Flush and close document
EndDocument();

生成PDF的应用,它的原文是《Using S# to generate PDF documents》,请找到这篇文章并下载代码体会。

通过这个例子,你也可以用它来生成Word/Excel文件。也许,一个动态生成文件的系统的方案产生于你的脑海中,根据用户选择的文件类型(PDF,DOC,XLS),动态调用这个脚本来生成相应类型的文件。这里的动态生成是有好处的,你可以不用编译程序,而只改变这里的脚本代码,来适应客户对文件内容格式(比如layout)的更改。

 

外壳命令 Shell Command

来实现一个拷贝文件的copy命令,代码如下

class Program{static void Main(string[] args){                    RuntimeHost.Initialize();                 Script script = Script.Compile(@"return Copy('a.xls','d:\Document'); ");script.Context.SetItem("Copy", new CopyFunction());object result = script.Execute();Console.WriteLine(result);Console.ReadLine();}}public class CopyFunction : IInvokable{      public bool CanInvoke(){return true;}public object Invoke(IScriptContext context, object[] args){string sourceFile =Convert.ToString(args[0]);string destintionFolder=Convert.ToString(args[1]);if(!Directory.Exists(destintionFolder))Directory.CreateDirectory(destintionFolder);string targetFile=Path.Combine(destintionFolder,Path.GetFileNameWithoutExtension( sourceFile)+Path.GetExtension( sourceFile));File.Copy(sourceFile,targetFile);return   targetFile;}       }

有了这个做基础,你可以实现这样的功能:每日构建 Daily Build,请参考文章《图解持续集成--纯命令行实现.Net项目每日构建》

clip_image001

也可以做到这样的功能

clip_image001[6]

原文作者使用的bat/cmd的Windows外壳命令,而这里使用的是Script.NET脚本,可以嵌入到其它应用程序中,被应用程序启动并执行。

 

访问SQL Server数据库

sql = DbProviderFactories.GetFactory("System.Data.SqlClient");
connection = sql.CreateConnection();
connection.ConnectionString = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";
connection.Open();command = sql.CreateCommand();
command.Connection = connection;
command.CommandText = "select * from Customers";reader = command.ExecuteReader();
while (reader.Read())
{Console.WriteLine(reader["CompanyName"]+". "+ reader["ContactName"]);}
connection.Dispose();  

这个例子在前面已经举例过,它可以引深为对其他数据源的操作(MySQL,Oracel…)

 

工作流系统中的自定义代码活动

这个应用是我在思考工作流的规则编辑器时想到的,请看下图

 

我们知道,在自定义的工作流系统中,CodeActivity是最有价值的活动,可以做任何想做的事情,但也非常不好用。因为工作流的用户,不是做编程的,不懂C#.NET,所以,你不能指望他会改变这一点。Script.NET则弥补了这个缺陷,可以让工作流设计人员,在我的脚本编辑环境中,编辑脚本,给工作流添加灵活的脚本代码,在执行时,由Script.NET解析引擎执行。只要脚本编辑环境足够智能灵活,提供的Script Sample足够多,这个CodeActivity(应该改名叫ScriptActivity)为增加自定义的工作流系统的灵活性,发挥极大的作用。

 
 

自动化操作  Windows Automation

要达到这个功能,要参考Windows Automation API,请参考这里this article。

先来看一下应用的脚本是什么样子的,再来看实现原理

// Close existing instances of Notepad
Kill(“notepad”); 
// Launch a new Notepad instance and get main window
window = Launch(“notepad”); 
// Wait 1 second
Wait(1000); 
// Get main editor region
edit = FindByClassName(window, “Edit”); 
// focus main editor
FocusEditor(edit); 
// Send sample text to the editor region
SendKeys.SendWait(“Automating Notepad using Windows UI Automation and S#”); 
Wait(3000); 
// Find [File] menu
mnuFile = FindById(window, “Item 1″); 
// Expand [File] menu
Expand(mnuFile); 
Wait(1000); 
// Invoke [Save As] menu item
InvokeById(window, “Item 4″); 
Wait(1000); 
// Get [Save As] dialog
saveAsDialog = FindByName(window, “Save As”); 
// Get access to [FileName] textbox
saveAsName = FindById(saveAsDialog, “1001″); 
// Focus filename editor 
FocusEditor(saveAsName); 
// Write down file name
SendKeys.SendWait(“D:\\MyTextFile”); 
// Send [Enter] keypress
SendKeys.SendWait(“{ENTER}”); 
Wait(1000); // Check whether Overwrite Dialog appeared
confirmSaveAs = FindByName(saveAsDialog, “Confirm Save As”); 
if (confirmSaveAs != null) 
{ // Click [OK] button InvokeById(confirmSaveAs, “CommandButton_6″); Wait(1000); 
} // Expand [File] menu
Expand(mnuFile); 
Wait(1000); 
// Click [Exit] item
InvokeById(window, “Item 7″); 

这是在做什么,打开Notepad,在里面输入文字,最后保存文件,全部的实现都是用脚本来做的。这令我想到了自动化测试,UI自动化测试。确实是这样的,自动化的脚本代替了人工操作,完全不需要人为干预。

这个应用的原文是《Windows Automation: Automating Windows 7 Notepad within S# Script》。

 

动态窗体  Dynamic Silverlight Forms. Embedding S# Scripts into Xaml

对于Silverlight技术不熟悉,请用文章原文查看具体内容。我能理解到意思是,可以把以脚本的方式创建窗体,这样的窗体是动态的,而不编译时就写死的,自然是非常灵活的方法。

 

推荐一个小技巧,我想把Script.NET的脚本,像对待外壳命令一样,双击执行,或是右键点击执行,如下面的效果所示

image

先把Script.NET的原代码中的RunTests程序改造成可以接受一个文件参数的可执行文件,像这样

它的原来的用法是这样:Usage: RunTests.exe folderPath

改成这样的用法 Usage:  RunTests.exe  scriptFile

这样的用意是,让它接受一个Script.NET脚本文件名,并能执行它。

再到外壳中注册文件关联,比如我把Script.NET的文件扩展名定义为spt文件,并添加这样的注册表项

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\SystemFileAssociations\.spt\shell\RunTests]

这样就在外壳命令中关联了Script.NET的脚本文件spt和它的执行程序RunTests,达到可以像bat文件一样,双击执行。

 

总结:本质上,Script.NET的脚本运行还是解析为DotNet代码的执行,所以不必怀疑它能做什么,.NET能实现的功能,都能做到。问题是我们是否需要这样的动态脚本,来增强程序的可扩展性,灵活性,这取决于你,it is up to you。

转载于:https://www.cnblogs.com/JamesLi2015/archive/2011/09/21/2183072.html

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

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

相关文章

异常值处理 - iterrows()对 DataFrame 进行遍历,并修改遍历中的异常值 - Python代码

先要有一个很简单的被命名为 data 的表: 第三列是一个名曰周杰伦的人历年来每个月的月薪,其中2016年月薪10万,纵观他历年来的月薪基本不超过3万(显然他不是我的偶像胖伦),因此对于这个人来说月薪10万是有些…

LeetCode 44. 通配符匹配(DP)

1. 题目 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 ? 和 * 的通配符匹配。 ? 可以匹配任何单个字符。* 可以匹配任意字符串(包括空字符串)。 两个字符串完全匹配才算匹配成功。 说明: s 可能为空,且只包含从 a-…

HtmlAgilityPack/xpath

【转载】HTML解析利器HtmlAgilityPack在网上发现了一个.NET下的HTML解析类库HtmlAgilityPack。HtmlAgilityPack是一个支持用XPath来解析HTML的类库,在花了一点时间学习了解HtmlAgilityPack的API和XPath之后,周公就做了一个简单的工具完成了这个功能&…

MVVM更容易内存泄露吗?

由于MVVM是把View, ViewModel, Model紧紧绑定在一起的模式,特别视图和视图模型通过实现观察者模式双向绑定和NotifyPropertyChanged事件,似乎更加容易造成内存泄露/内存不释放。网上也有这种说法。真的是这样的吗?我们来实际测试一下。 实际测…

分组统计 - 不同时间颗粒度下,按照秒、分、时、日、周、月、季度、年 GROUP BY 分组统计 - (MySQL)

数据处理时,经常需要:统计不同时间粒度下的数据分布情况。 例如,网站每天(or每小时)的访问量,周杰伦每年(or每季度 or每月)的收入等。 首先有一个表叫:table_test&…

LeetCode 971. 翻转二叉树以匹配先序遍历(DFS)

1. 题目 给定一个有 N 个节点的二叉树,每个节点都有一个不同于其他节点且处于 {1, …, N} 中的值。 通过交换节点的左子节点和右子节点,可以翻转该二叉树中的节点。 考虑从根节点开始的先序遍历报告的 N 值序列。将这一 N 值序列称为树的行程。 &…

缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)

有的时候做数据清洗的时候 , 如果表中数据在某一天没有记录,但是业务要求不能有缺失日期,那么就需要我们将这些缺失日期补上。这个前提就是我们先要有一张包含所有日期的列表(作为左表),供我们进行匹配&…

[Kaggle] Digit Recognizer 手写数字识别

文章目录1. Baseline KNN2. Try SVCDigit Recognizer 练习地址 相关博文:[Hands On ML] 3. 分类(MNIST手写数字预测) 1. Baseline KNN 读取数据 import pandas as pd train pd.read_csv(train.csv) X_test pd.read_csv(test.csv)特征、…

Power BI 数据分析可视化软件入门教程

入 门 l Power BI 的引导学习 什么是Power BI? Power BI 是软件服务、应用和连接器的集合,它们协同工作以将相关数据来源转换为连贯的视觉逼真的交互式见解。 Power BI 简单且快速,能够从 Excel 电子表格或本地数据库创建快速见解。同…

分组统计 - DataFrame.groupby() 所见的各种用法 - Python代码

目录 所见 1 :日常用法 所见 2 :解决groupby.sum() 后层级索引levels上移的问题 所见 3 :解决groupby.apply() 后层级索引levels上移的问题 所见 4 :groupby函数的分组结果保存成DataFrame groupby的函数定义: Da…

线性回归 - 多元线性回归案例 - 分析步骤、输出结果详解、与Python的结果对比 -(SPSS建模)

现在用 Python 写线性回归的博客都快烂大街了,为什么还要用 SPSS 做线性回归呢?这就来说说 SPSS 存在的原因吧。 SPSS 是一个很强大的软件,不用编程,不用调参,点巴两下就出结果了,而且出来的大多是你想要的…

R12 应付款模块(AP):预付款(prepayment)的标准处理流程

预付款的概念 财务会计的解释: 企业对于某些物资有时需要采取预先订购的方式,即按照购货合同规定预付一部分货款。这部分预先付给供货单位的订货款就构成了企业的预付账款。(来自会计学概论,要区分定金和预付款的区别!…

LeetCode 391. 完美矩形(set检查顶点+面积检查)

1. 题目 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。 每个矩形用左下角的点和右上角的点的坐标来表示。例如, 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1) 以及右上角的点的坐标为 (2, 2) )。…

时间序列 - 案例按步骤详解 -(SPSS建模)

时间序列简单的说就是各时间点上形成的数值序列,通过观察历史数据的变化规律预测未来的值。在这里需要强调一点的是,时间序列分析并不是关于时间的回归,它主要是研究自身的变化规律的。 准备工作:SPSS - 中文版 SPSS 22.0 软件下…

特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码

Python 进行 DataFrame 数据处理的过程中,需要判断某一列中的值(条件),然后对其他两列或三列进行求和(均值/最值)等运算,并把运算结果存储在新的一列中。干说可能觉得比较晕,我们来看…

非线性回归 - 案例按步骤详解 -(SPSS建模)

在上一篇时间序列的文章中,偶然发现另一份数据的整体趋势很符合非线性回归关系,那么就顺势写一篇非线性回归案例的文章吧。 准备工作:SPSS - 中文版 SPSS 22.0 软件下载与安装教程 - 【附产品授权许可码,永久免费】 数据解释&am…

邮件服务器之POP3协议分析

第1章. POP3概述 POP3全称为Post Office Protocol version3,即邮局协议第3版。它被用户代理用来邮件服务器取得邮件。POP3采用的也是C/S通信 模型,对应的RFC文 档为RFC1939。 该协议非常简单,所以我们只重点介绍其通信过程,而相关…

Python 画图常用颜色 - 单色、渐变色、混色 - 够用

单色 装了seaborn扩展的话,在字典seaborn.xkcd_rgb中包含所有的xkcd crowdsourced color names。如下: plt.plot([1,2], lw4, cseaborn.xkcd_rgb[baby poop green]) 虽然觉得上面的已经够用了,但是还是备份一下这个最全的吧。 渐变色&…

[scikit-learn 机器学习] 2. 简单线性回归

文章目录1. 简单线性回归2. 评价模型本文为 scikit-learn机器学习(第2版)学习笔记1. 简单线性回归 import numpy as np import matplotlib.pyplot as pltX np.array([[6],[8],[10],[14],[18]]) y np.array([7,9,13,17.5,18]) plt.title("pizza …

Matplotlib - 散点图 scatter() 所有用法详解

目录 基本用法 散点的大小不同(根据点对应的数值) 散点的颜色不同(指定颜色或者渐变色) 散点图和折线图是数据分析中最常用的两种图形,他们能够分析不同数值型特征间的关系。其中,散点图主要用于分析特征…