COM互操作 - 在VB 脚本里面使用.NET类型

请看下面这段VBS代码

Set obj = CreateObject("System.Collections.ArrayList")

obj.Add("this is a test")

obj.Add(1)

obj.Add(obj)

MsgBox obj(0)

MsgBox obj(1)

MsgBox obj(2).ToString()

代码里面试图创建一个ArrayList.NET对象,然后添加了几个不同类型的对象在这ArrayList里面,最后显示结果。为什么我们可以在VBS里面使用.NET里面的内建类型呢?这是因为.NET安装好了以后,在注册表里面将所有COM可见的类型都注册过了,打开注册表编辑器,你会看到SYstem_CLASS_ROOT下面有很多以System.开头的progid,这些progidCLSIDInprocServer都是mscoree.dll,也就是说在VB script脚本里面的CreateObject对象调用时,COM库通过mscoree.dll加载CLR,然后创建System.Collections.ArrayList对象并最终返回给VB Script程序。

MsgBox obj(1)也有玄机,要知道,在ArrayList里面只能保存Object类型的数据,也就是说但是obj.Add(1)调用完毕以后,ArrayList第二个元素是一个object类型,那么为什么MsgBox obj(1)却能够正确显示1呢?Object类型里面有好几个函数,例如EqualsGetHashCode,为什么其他的函数调用,而偏偏调用ToString函数呢?这是因为.NETToString函数disPID设置为零了,在COM里面,disPID0函数认的调用函数

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...