使用VSA给程序加上脚本支持
今天翻看.NET的类库,发现一个不知道的命名空间Microsoft.Vsa,于是找了找资料,才知道这个东西是为了给程序添加脚本支持。(当前只支持VB.NET,和JScript.NET),于是,试了试。
先要做一个引擎宿主,目的是把VSA(Visual Studio for Applicaiton)引擎调进来,然后执行脚本。
using System;
using Microsoft.Vsa;
using Microsoft.VisualBasic.Vsa;
namespace VsaEngine
{
public class ScriptHost : Microsoft.Vsa.IVsaSite
{
private byte[] code = new byte[1024];
private Microsoft.Vsa.IVsaEngine engine = null;
private Microsoft.Vsa.IVsaItems items = null;
public ScriptHost() // 设置vsa引擎的一些参数
{
engine = new Microsoft.VisualBasic.Vsa.VsaEngine();
engine.RootMoniker = "test://cnblogs.com/VsaEngine";
engine.Name = "VsaEngine";
engine.RootNamespace = "VsaEngine";
engine.Site = this;
items = engine.Items;
IVsaReferenceItem refItem = items.CreateItem("VsaEngine", Microsoft.Vsa.VsaItemType.Reference, VsaItemFlag.None) as IVsaReferenceItem;
refItem.AssemblyName = System.IO.Directory.GetCurrentDirectory() + "\VsaEngine.dll";
IVsaGlobalItem globalItem = items.CreateItem("HostObject", VsaItemType.AppGlobal, VsaItemFlag.None) as IVsaGlobalItem;
globalItem.TypeString = "VsaEngine.ScriptHost";
}
public bool SetScript(string scriptString) // 设置脚本,并进行语法检查
{
IVsaCodeItem codeItem = items.CreateItem("testCode", Microsoft.Vsa.VsaItemType.Code, Microsoft.Vsa.VsaItemFlag.Class) as IVsaCodeItem;
codeItem.SourceText = scriptString;
return engine.Compile();
}
public void Run() // 执行脚本
{
engine.Run();
}
private string _testMember = "Test";
public string TestMember // 用来测试的一个属性
{
get
{
return _testMember;
}
set
{
_testMember = value;
}
}
public string GetResult() // 获取脚本执行结果
{
System.Type type = engine.Assembly.GetType("VsaEngine.myModule", true, true);
System.Reflection.MethodInfo[] mi = type.GetMethods();
System.Collections.IEnumerator enu = mi.GetEnumerator();
System.Reflection.MethodInfo method = type.GetMethod("myMethod");
object result = method.Invoke(this, null);
return result.ToString();
}
IVsaSite 成员
}
}
然后就可以调用了
private void button1_Click(object sender, System.EventArgs e)
{
System.Text.StringBuilder sbScript = new System.Text.StringBuilder();
sbScript.Append("Module myModule ");
sbScript.Append("Public Function myMethod As String ");
sbScript.Append("With HostObject ");
sbScript.Append(".TestMember="Hello World!" ");
sbScript.Append("End With ");
sbScript.Append("Return " OK" ");
sbScript.Append("End Function ");
sbScript.Append("End Module ");
ScriptHost host = new ScriptHost();
if(host.SetScript(sbScript.ToString()))
{
host.Run();
MessageBox.Show("VB script return value: " + host.GetResult() + " Local member value: " + host.TestMember);
}
else
MessageBox.Show("Compile Error");
}
还可以把VSA的IDE一起做进来,我还没做测试程序。
总的感觉还不错。除了给程序增加脚本支持外,还可以模拟BizTalk做工作流引擎的组件处理了![]()


浙公网安备 33010602011771号