先写在这里吧,这段时间工作忙,私事又多,过两天再完整地写下去...
今天抽点时间写点内容。
有一次项目中,WinForm上需要旋放置某基于COM组件的ActiveX控件,开始只是制作成DLL项目,后来根据客户要求,要被作为Web服务将这个DLL项目发布出来,但这时就遇到了COM组件的单线程问题。
COM组件,尤其是必须依附WinForm而存在的ActiveX控件,必须与WinForm同样,在单线程中运行(一般情况下,咱们会看到程序入口的Main方法上加有[STAThread]的特性,以表明该程序要以单线程套间的方式运行)。
在DLL项目中,因为WinForm直接存在,所以使用COM(ActiveX)完全没有问题,编译完后,直接在本地运行自成的exe文件(窗体)即可。而换成发布为Web服务,就不是那么简单的事了(也可说成是前端的Web项目调用后台的DLL项目)。
从Web端调用后台DLL(调试时必须要先按一下F11才能进入后台DLL里代码,不然直接按F5,即使后台某处有断点也无法进入,之后F5呀F11呀怎样都可以)中某公共方法,进入DLL代码,创建WinForm实例(Form1 form = new Form1()…)后,即可发现ActiveX控件的对象已经被实例化,这里咱们可以像之前调试DLL项目那样正常进行;但如果该被调用的公共方法结束后返回Web端,再次调另外的公共方法进入DLL代码时,ActiveX控件就会抛出“COM对象与其基础RCW分开后不能再使用该对象”之类的异常,也就是说此时ActiveX控件已经与WinForm分离开了,接下来根本无法再次使用。
这个问题上网发了贴,查了国外的网站,花了近两周时间,焦头烂额,终于被我在某国外网站上找到了解决的办法。
http://home.infusionblogs.com/thunter/Lists/Posts/Post.aspx?ID=18
…困死了,过两天有空了再接着写吧,个别代码点的分析也一起写出来…