那位高手可以给点microsoftvsa的使用的代码,不胜感激!!!

liuyalun 2004-10-28 04:24:11
我想用jscript。net来做脚本语言,在程序里引用,但是看了一些资料还是不明白vsa的使用,请高手给初学者一点建议。
...全文
168 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
华芸智森 2005-03-05
  • 打赏
  • 举报
回复

Visual Studio for Application 内幕之一
关于vsa 的文档资料非常少,这也是我决定写一些介绍些文字的目的。当然,这里只是我对vsa的一些理解,可能有错误的地方,同时,也可能不适合初学者。
由于内容很多,计划分多次介绍
" 概述
" 装入预编译代码
" HostObject
" Vsa IDE
" Vsa sdk 部分(可能分多次)

在最前面的讲述中,我们不使用vsa sdk ,实际上,不用vsa sdk也可以实现所有的功能,在后面,我们详细介绍Vsa sdk(主要以beta 2为例,当然,我也打算介绍无意中发现的Vs.net 2003的vsa sdk版本)
相关命名空间
首先,我们来查看关于vsa的命名空间,发现有
Microsoft.Vsa(Microsoft.Vsa.Dll)
Microsoft.VisualBasic.Vsa(Microsoft.VisualBasic.Vsa.Dll)
Microsoft.JScript.Vsa(Microsoft.JScript.Vsa.Dll)
Microsoft_VsaVb(Microsoft_VsaVb.dll)

刚涉及vsa的开发者,很难理清其内在关系。我的理解是
vsa的功能实际上由基于com的实现完成,vsavbdt.dll是vsa设计时,而vsavb7rt.dll则是vsa运行时
Microsoft.Vsa 定义了基本的接口,枚举,异常
这里面重要的是VsaLoader类
VsaLoader主要用于装载和执行预先编译的vsa代码,只实现部分IVsaEngine接口,执行起来非常的快,在第二部分我们会介绍如何使用VsaLoader来装载预编译的Vsa代码
Microsoft_VsaVb是com实现的.net包装,查看Microsoft_VsaVB的代码,会发现其主要使用ComImportAttribute,Microsoft_VsaVB定义了VsaDTEngine接口(实现IVsaDTEngine接口),VsaDTEngineClass类(实现VsaDTEngine接口),VsaEngine接口(实现IVsaEngine接口),VsaEngineClass(实现VsaEngine接口)

而Visualbasic.Vsa和Microsoft.JScript.Vsa则分别是vb.net和JScript的具体实现
理解site 的概念
site相当于场所,VsaEgnine有IVsaSite的接口属性Site,其意义是我们需要创建一个实现IVsaSite接口的类,接受从VsaEngine引发的,如Notify,OnCompilerError,向实现IVsaEngine接口的对象提供值,如GetCompiledState,GetGlobalInstance等
IVsaSite非常重要,在以后我们会谈到
如:
读取预编译的代码
hostobject等

创建一个实现IVsaSite的类
imports Microsoft.vsa
class MyVsaSite
implements IVsaSite
.....
end class

任务场景:使用Microsoft.VisualBasic.vsa.VsaEngine 动态装入一个vb.net Class并运行
这是一个最通常的任务
在这个例子中,Textbox1中有一个class的代码,其代码如下
class TestClass
public shared sub Hello(byval name as string)
System.Windows.Forms.MessageBox.Show(name)
end sub
End Class
1、引用Microsoft.Vsa.dll,Microsoft.VisualBasic.vsa.dll
2、
imports Microsoft.Vsa
Imports Microsoft.VisualBasic.Vsa
3、在模块级定义IVsaEngine 变量
dim m_VsaEngine as IVsaEngine
4、创建Microsoft.VisualBasic.Vsa.VsaEngine的一个实例
m_VsaEngine=new Microsoft.VisualBasic.Vsa.VsaEngine()
5、 设置RootNameSpace和RootMoniker
m_VsaEngine.RootNameSpace="Test"
m_VsaEngine.RootMoniker="myapp://Project1"
6、设置Site属性(注:site必须在RootMoniker后设置)
m_VsaEngine.Site=new MyVsaSite
7、创建一个IVsaCodeItem实例
Dim codeItem As VsaCodeItem
codeItem = m_VsaEngine.Items.CreateItem("test", Microsoft.Vsa.VsaItemType.Code, Microsoft.Vsa.VsaItemFlag.Class)
codeItem.AppendSourceText(TextBox1.Text)
8、编译并运行
If m_VsaEngine.Compile() Then
m_VsaEnigne.Run()
End If
9、调用是通过Reflection进行的,为了简化这个调用过程,我用vb.net模拟了vsa sdk中的Runtime类Invoke的过程

Dim args() As Object = New Object() {"jjx"}
Invoke("TestClass.Hello", args)
Invoke 的vb.net实现

Public Overloads Function Invoke(ByVal methodName As String, ByVal arguments() As Object) As Object
If methodName Is Nothing OrElse String.Compare(methodName, "") = 0 Then
Throw New ArgumentNullException("methodName")
End If
If v Is Nothing Then
End If
If Not m_VsaEngine.IsRunning Then
m_VsaEngine.Run()

End If
Dim chs2() As Char = New Char() {"."}
If methodName.Split(chs2).Length < 2 Then
Throw New Exception("")
End If
Dim i As Integer = methodName.LastIndexOf(".")
Dim str1 As String = methodName.Substring(0, i)
Dim str2 As String = methodName.Substring(i + 1)
Dim str4 = String.Concat(ScriptEngine.RootNamespace, ".", str1)
Dim methodInfo As MethodInfo = ScriptEngine.Assembly.GetType(str4, True, True).GetMethod(str2)
If Not methodInfo Is Nothing Then
Return methodInfo.Invoke(Nothing, arguments)
End If
End Function

编译错误
通过实现IVsaSite接口的OnCompilerError可以了解编译错误信息

Public Function OnCompilerError(ByVal [error] As Microsoft.Vsa.IVsaError) As Boolean Implements Microsoft.Vsa.IVsaSite.OnCompilerError
Debug.WriteLine([error].Description)

End Function
posted on 2003-11-17 19:04:19
Reader Comments
标题: re: Visual Studio for Application 内幕之一
名字: jjx
发表时间: 2003-11-19 8:06:19
计划写完这个系列后就看 VSIP Extras 2003,不过vsip在实际项目中并不那么有用,因为这方面的需求估计只有国内几个大的公司才会有
标题: re: Visual Studio for Application 内幕之一
名字: ccBoy
发表时间: 2003-11-18 3:16:02
我在评测网的Download目录下放了一个VSIP 2003的SDK.
4.44 MB的是VSIP Extras 2003 Beta,我看上面说已经提供对C#和VB.NET的支持了.
你试一试了.我还没试.最近我所有可以用的机器都在升级.
但愿VSIP Extras 2003 有更Cool的体验.

VSIP Extras is an add-on for the VSIP 2003 SDK and provides additional capabilities for developing integration packages. Features include:

1. .NET Framework support. Interop assemblies are provided to allow VSIP packages to be developed in C#, managed extensions for C++, or Visual Basic. New samples have been provided in managed languages and the documentation has been updated to include information about managed code development.
2. VSIP Wizards. It has never been easier to get started on a new integrated product. Our new Integration Package wizard and Language Service wizard take care of all of the basic setup for you, leaving you more time to focus on your product's specific features.

华芸智森 2005-03-05
  • 打赏
  • 举报
回复
.NET 框架类库
Microsoft.Vsa 命名空间

Microsoft.Vsa 命名空间包含一些接口,这些接口使您可以将用于 .NET 框架的 Script 脚本引擎集成到应用程序,然后在运行时编译和执行代码。
命名空间层次结构
接口
接口 说明
IVsaCodeItem
表示将由脚本引擎编译的代码项。
IVsaEngine
定义脚本引擎必须支持的方法和属性并提供对脚本引擎的编程访问。
IVsaError
提供对执行 IVsaEngine.Compile 方法期间所遇到的编译错误的访问。
IVsaGlobalItem
描述添加到脚本引擎中的全局对象。
IVsaItem
为添加到 .NET 脚本引擎的所有项(包括代码项、引用项和全局项)定义接口。它定义适用于引擎识别的所有项类型的一般属性和方法。
IVsaItems
定义 IVsaItem 对象集合的接口,可以通过名称或索引对其进行寻址。
IVsaPersistSite
使用由宿主实现的保存和加载操作,来管理项目持久性以及存储与检索代码和其他项。
IVsaReferenceItem
描述添加到脚本引擎的引用。
IVsaSite
使宿主与脚本引擎之间能够进行通讯。此接口由宿主实现。
枚举
枚举 说明
VsaError
定义可以由 .NET 脚本引擎引发的异常集。
VsaItemFlag
将代码项的类型标识为"类"、"模块"或"无"。
VsaItemType
将项类型标识为"代码"、"参考"或"AppGlobal"。
请参见
.NET 框架类库


将文档反馈发送给 Microsoft
? 2002 Microsoft Corporation。保留所有权利。
'==================================================

使用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");
}


'===============================================================
组合缺一 2005-01-19
  • 打赏
  • 举报
回复
我也急需这个,帮顶。
内容概要:本文系统研究了在电力系统负荷发生突变的动态环境下,采用无迹卡尔曼滤波(UKF)与自适应无迹卡尔曼滤波(AUKF)进行三相状态估计的方法。通过Matlab平台实现了两种滤波算法的仿真模型,构建了包含三相电力系统建模、非线性状态方程推导、量测系统设计在内的完整状态估计框架。重对比分析了UKF与AUKF在突变负荷扰动下的估计精度、收敛速度与鲁棒性,深入探讨AUKF通过实时调整噪声协方差实现自适应的能力,从而有效应对系统模型不确定性和外部动态变化,提升状态估计的可靠性。研究为智能电网在复杂动态工况下的实时监控、安全评估与优化控制提供了坚实的算法基础与仿真验证手段。; 适合人群:具备电力系统分析、现代控制理论基础及一定Matlab编程能力的研究生、科研人员和工程技术人员。; 使用场景及目标:① 掌握UKF在非线性电力系统状态估计中的具体应用流程与实现细节;② 深入理解AUKF的自适应机制及其在负荷突变、模型失配等动态工况下提升估计性能的原理与优势;③ 为智能电网的状态监测、故障诊断、实时调度与主动防御等高级应用提供可靠的算法支持与可复现的仿真平台。; 阅读建议:建议读者结合电力系统状态估计的经典理论,仔细研读并运行所提供的Matlab代码,重关注系统模型的建立、UKF/AUKF算法的参数初始化、负荷突变事件的建模方式,以及两种算法在电压、电流等状态变量估计误差上的对比分析,通过仿真结果的可视化深入理解算法差异与工程应用价值。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧