C#发现之旅:于动态编译的VB.NET脚本引擎(上)
2010-09-30 21:08:18 来源:WEB开发网在一些脚本中笔者经常可以看见类似“window.left”或者“document.location”的方式来使用全局对象,若笔者在VB.NET中直接使用“window.left”之类的代码必然报“window”对象或者变量找不到的编译错误。
“window”全局变量一般映射到应用程序的主窗体。比如“window.left”表示主窗体的左端位置,“window.width”标准主窗体的宽度等等。【袁永福原创,转载请注明出处】
“document”或者“window”等全局对象是映射到文档或者主窗体等实例对象的,因此它们的成员不能定义成静态,为了能实现在脚本代码中直接使用类似“window.left”的方法来直接使用全局对象,笔者又得使用VB.NET的一个语法特性。在Microsoft.VisualBasic.dll中有一个公开的特性类型“Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute”,该特性是隐藏的,可能不是微软推荐使用,但在微软.NET框架1.1和2.0都有这个特性类型,功能也是一样的。对于一般的编程该特性是用不着的,它可附加在某个类型上,VB.NET编译器会认为附加了该特性的类型的静态属性值就是全局对象。比如笔者定义了一个GlobalObject类型,附加了StandardModuleAttribute特性,它有一个名为Document的静态属性,在对于脚本中的“document.Location”代码块,VB.NET编译器会针对“document”标识符检索所有附加了StandardModuleAttribute的类型的静态属性,最后命中GlobalObject类型,于是会自动扩展为“GlobalObject.Document.Location”的代码。这个过程是在编译时进行的,在实际运行中不再需要进行这样的查找,这样的语法特点是C#所没有的。上述的这些特点使得VB.NET语法更适合作为脚本的语法。
更多精彩
赞助商链接