请看下面这段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,这些progid的CLSID的InprocServer都是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类型里面有好几个函数,例如Equals,GetHashCode,为什么其他的函数不调用,而偏偏调用ToString函数呢?这是因为.NET将ToString函数的disPID设置为零了,在COM里面,disPID为0的函数为默认的调用函数。
原文地址:https://www.jb51.cc/vb/263295.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。