Visual Studio for Application 内幕之一
关于vsa 的文档资料非常少,这也是我决定写一些介绍些文字的目的。当然,这里只是我对vsa的一些理解,可能有错误的地方,同时,也可能不适合初学者。
由于内容很多,计划分多次介绍
" 概述
" 装入预编译代码
" HostObject
" Vsa IDE
" Vsa sdk 部分(可能分多次)
创建一个实现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.
将文档反馈发送给 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];