• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

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

liuyalun 2004-10-28 04:24:11
我想用jscript。net来做脚本语言,在程序里引用,但是看了一些资料还是不明白vsa的使用,请高手给初学者一点建议。
...全文
92 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过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
我也急需这个,帮顶。
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-10-28 04:24
社区公告

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