.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之后,周公就做了一个简单的工具完成了这个功能&…

特征计算 -获取本周,本月初,本月末,上月同日,本季,本年初,本年末的日期 - (Python、MySQL、Oracle)

数据预处理的过程中,往往需要计算当前日期往前推12个月(或者本周,本月,本季,本年)中间发生的事情, 因此这里贴上相关处理的代码: Python代码: import datetime from d…

LeetCode 966. 元音拼写检查器(哈希)

1. 题目 在给定单词列表 wordlist 的情况下,我们希望实现一个拼写检查器,将查询单词转换为正确的单词。 对于给定的查询单词 query,拼写检查器将会处理两类拼写错误: 大小写:如果查询匹配单词列表中的某个单词&…

MVVM更容易内存泄露吗?

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

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

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

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

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

初学Struts遇到的坑爹问题

主要页面 Action: LoginAction.java //用于处理登陆这个事件 FromBean: LoginForm.java //存储Login.jsp中传过来的表单内容 JSP:Login.jsp //登陆页面,提交到login.do XML配置文件:struts-config.xml,web.x…

缺失值处理 - 获取一段时间内所有日期的列表 - (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)特征、…

C#中的类型转换大总结

使用C#一个最常见的问题便是各种类型间的转换。我们知道,C#中的类型分为值类型和引用类型两大类。但是,有关它们间各自转换的细节描述在网上很少得到详细的回答。现在,我结合搜索到的部分资料整理如下: 1,问题 c#中类型…

DataFrame字符串之分割split()、清洗drop()、合并concat()、重新建立索引reset_index() - (Python)

数据建模之前,我们从数据部门拿到数据,但是这些数据的格式往往并不是我们可以直接使用的,比如下面表中的数据(左:原数据格式)。 原数据格式id自成一列,这个很好,但是标签和标签的置…

LeetCode 97. 交错字符串(DP)

1. 题目 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例 1: 输入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 输出: true示例 2: 输入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc&qu…

浅谈 JavaScript 编程语言的编码规范--转载

原文:http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/ 对于熟悉 C/C 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散。很容易学习,并运用到自己的代码中。…

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…

LeetCode 1486. 数组异或操作

1. 题目 给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后得到的结果。 示例 1: 输入&#…

C 内存管理详解

程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。   1、…

对照表 - 用心整理了一批国内省份、城市、县城的对照表,用于匹配,拿走不谢

采集的数据中,企业注册地址往往都是城市名,如果你想知道这些企业分布的省份,那么就需要这样一张对照表。 文件存储位置: 百度网盘链接: https://pan.baidu.com/s/1T8aobyzXRRvDQ0NjcEBCUw 提取码: cm7g 以下是文件中的前 100 …