(一) ActiveX的发展历史及技术基础
只要是有多年以上程序开发经验的开发人员,多多少少都会听过ActiveX控件这个东西,这个是只存活在Internet Explorer上的可程序化组件(Programmable Component),它可以允许在浏览器上执行低阶层次的系统呼叫与存取工作,在Web应用程序平台发展的初期,当时网景公司(Netscape)的Navigator浏览器正和Internet Explorer打得火热的时候,微软为了要能对抗在Navigator内的Plug-in技术,在Internet Explorer内也加入了允许开发人员在网页内加入具有动态效果的用户接口组件的技术,ActiveX技术就这样诞生了,在第一轮的浏览器大战由微软胜出后,许多的ActiveX控件也如雨后春笋般的冒出来,也因为ActiveX控件是目前唯一可以在IE浏览器上绕过浏览器沙盒(Browser Sandbox)而直接与系统层次沟通的组件,所以现在仍广为金融界所应用(开发网络ATM),国内除了金融界以外,政府单位也是大客户(应用自然人凭证验证机制)。
ActiveX技术是1996年出现的,它的核心是COM(Component Object Model),当时COM和OLE是两个不同的技术,而微软为了要让OLE可以在Internet上使用,特别在COM以及OLE中加入一些特别的接口,让应用程序可以透过一个简单的接口来存取在组件内的所有功能,以往要开发一个COM组件,必须要实作IUnknown接口以及应用程序自己的接口,并将接口注册到COM Registry Databases(HKEY_CLASS_ROOT)内,而客户端程序使用COM Client Library先自组件取得IUnknown接口以及呼叫由组件所实作的QueryInterface()方法取得组件自己的接口后,才可以呼叫自己的接口,而且没有可以间接呼叫的方式,这种模式不利于在Internet上使用,而且当时Visual Basic 4.0也提供了OCX的控件(OLE Control)开发能力,微软也想要让VB可以开发COM组件,因此微软在COM接口中加入了一个新的接口-IDispatch接口,并且由COM Client Library直接支持,大家最常用的Office应用程序的核心部份就是利用IDispatch来实作各类对象,除了可以在应用程序间使用OLE来分享数据外,还可以让VB或其他程序语言透过COM接口来存取Office的对象模型,这样的作法让COM获得了巨大的支持,除了VB可开发COM组件外,其他的程序语言也可以遵循IDispatch接口实作来支持COM组件的开发。这样的技术后来整合了OLE的部份技术后,称为COM Automation(COM自动化)。
在ActiveX推出的時候,微軟为了要支持开发ActiveX Control,另外提供了一个小工具:ActiveX Control Pad,可用來测试开发完成的控件。您可以到此一下ActiveX Control Pad:http://msdn.microsoft.com/en-us/library/ms975966.aspx。后来在Visual Basic 6.0推出(1998年)时,微软的各式Internet应用程序开发成员皆已到位,像ASP/ADO这类的基础组件,以及Visual Studio 6.0套装开发工具等,让微软的Internet开发技术红极一时,当时作为核心技术的ActiveX也被提升到市场营销上,许多COM/OLE技术都被改为ActiveX技术,像ActiveX Document(原本是OLE Document)、ActiveX DLL(原本是COM DLL)、ActiveX EXE(原本是COM EXE)等。后来到了Microsoft .NET时代,ActiveX控件的发展也开始走下坡,同一时期的Flash则是开始窜起,第二次浏览器大战更让IE的市占率开始下降,相对的ActiveX控件也开始式微-因为它只有IE这个舞台。不过它可以存取硬件,且可由简单的程序语言开发的优点仍然受到开发人员欢迎,所以只要特殊的应用环境不消失,ActiveX控件也不会消失(因为在IE上的Flash本身也是ActiveX控件)。
(二).NET时代的ActiveX控件
在微软宣布全力支持Microsoft .NET平台的发展与Visual Basic经过本质上的变化(VBàVB.NET)后,ActiveX控件的开发就停顿在C++(MFC/ATL)、VB 6.0以及Delphi等开发工具,且COM本身也已经趋于稳定,只有很少量的基础变化,所以开发ActiveX控件的方法也没有再继续进化,目前开发ActiveX控件的作法其实和八年前没什么两样,钦定的开发工具仍然是C++以及VB 6.0,反观.NET Framework本身因为庞大的.NET Framework Class Libraries的关系,无法像C++/VB 6.0一样可以产生轻薄短小的封装档,且在当时COM Interoperability仍然不够成熟的情况下,原则上微软并不建议使用.NET Framework来开发ActiveX控件的(但鼓励在.NET应用程序内使用ActiveX控件,以保有原本的技术投资),不过近几年来CPU以及运算能力的强化,COM Interoperability的效能损耗逐渐降低,只要能够避免将.NET Framework一起封装的情况下,.NET Framework也可以用来开发ActiveX控件。
要使用.NET Framework来开发ActiveX控件,则必须要先了解.NET Framework如何将自己的信息开放给COM,既然都要让COM来存取了,那么当然也要将自己的型别信息开放给COM知道。其实要开放.NET Framework对象给COM这件事不难,只要在项目的属性中,在『生成』页签中,将『为COM互操作注册』勾选起来,这样Visual Studio会在编译时另外产生一个型别函式库(Type Library),并且使用Regasm.exe将组件注册到COM Registry Database中,让COM客户端应用程序可以看到这个COM组件。
接着,要设定COM客户端程序可以看到这个组件的多少对象,若是只要看到自己设定的对象类别时,则在对象类别上设定ComVisibleAttribute特征项(attribute),若是要让COM客户端看到组件内的所有公开类别时,就要设定让此组件为COM Visible,方法是打开项目内的Assembly.cs程序,并将下列指令的false改为true:
然后要为类别设定COM Visible,以及设定一个自己使用的GUID值,这个值会在登录接口时写入COM Registry Database内,而COM客户端程序就依据这个值和由编译程序自动产生的Programmable ID(ProgID)进行对应,以正确加载你的Activex组件。
//GUID号自己生成
[Guid("C90E96C1-8534-4243-9530-960D9AF982CB")]
[ComVisible(true)]
public class MyDateControl
设定完后编译项目,即可将组件开放给COM客户端。
(三).NET平台下ActiveX控件开发实战
Step 1:
Step 2:
Step 3
使用OLE View应用程序查看,请由左边展开Type Libraries,你可以在节点中找到AX
Step 4 页面测试