Infotech.ActiveX.Engine 设计思路

在公司开发过程中,提出ActiveX 方案,通过公司高层采纳,今天在研究和开发ActiveX 引擎;
已通过测试,成功部署.

ActiveX Engine 就是一个ActiveX 的形式,在html 页内运行;

实现原理为:


主要功能:
  Client 浏览器只需要安装2个必须的程序集;它负责从webservices后台调用Assembly 到本地,并装入;

要求:
  Assembly内部是使用UserControl ,那么它的Owner可以使用 exe 包装为标准Winform,如果是通过Activex engine 来运行的话,那么它也可以做一个RIA 应用;

难点:
  1.已解决:通过AppDomain 的方法拆装每个Assembly,避免影响当前域和Assembly版本冲突问题;但是如何将UserControl 增加到当前域的Controls内是个难点,不过我解决了;方法比较另类,直接使用非托管api实现的.
  2.已解决:远端assembly的相关程序集,采用智能化的搜索,打包->压缩->传输到client activex engine 使用.整个过程是透明的。
  3.未解决:脚本交互的时候,方法的参类型的变形,该问题一直未解决;在C#中比如参数为object[] Params.那么在javascript该如何传递呢?(目前采用非常蠢的办法凑合着)

用例:
  Assembly:Test1.dll

    class UserControlTest:UserControl {
     ...
    }

   HTML:Test.htm
   <object classid="......"/>
   <script type=text/javascript>core1.LoadAssembly("Test1.dll", "UserControlTest");</script>

  core1为ActiveX.Engine 实例:它提供装入方法,和Current UserControl 交互的方法,这部分的实现采用反射.

关于ActiveX.Engine ,是应用于b/s 在一些复杂的,低级的模块实现上的解决办法,比如:串口通讯/高级图表...等等.


关于该思路的起源:
http://chinasf.cnblogs.com/archive/2006/06/11/WINCTS.html


posted @ 2006-07-08 22:54 萧寒 阅读(1847) 评论(12)  编辑 收藏 网摘 所属分类: C# WinForms日记.NET WebForms

  回复  引用    
#1楼2006-07-09 13:45 | yzx110
看上去比较有意思,不过你这个图有点看不清楚。
还有好像来龙去脉不太清楚

  回复  引用  查看    
#2楼2006-07-09 15:38 | wuChang      
曾经我也试过这种方案,但后来发现很多员工的电脑都非自愿初装上了3721之类的拦截工具...最终还是放弃了。
  回复  引用  查看    
#3楼[楼主]2006-07-09 18:40 | 萧寒      
@yzx110
图已经放大了;

@wuChang
在一些复杂的,低级的模块实现上的解决办法,比如:串口通讯/高级图表...等等.

3721之类的拦截工具...鱼和熊掌不可兼得.

  回复  引用  查看    
#4楼2006-07-10 11:44 | 快活鱼      
更新有必要搞得这么复杂么?
页面中Object标记的codebase属性带上版本号,控件用微软的工具打包成CAB,inf文件带上版本号,不就可以实现自动更新了么?

  回复  引用  查看    
#5楼[楼主]2006-07-10 14:16 | 萧寒      
@快活鱼

难道这个复杂?你没有理解我的本意.

我只需要发布这个核心程序集,其他的assembly 全部都是动态从网络装入的;
如果CLIENT部署好了以后,可以随时增加内部的dll模块,其中还涉及到第三方的程序集;而它是和具体应用无关的,比如flash 插件,它自身的版本可以用codebase来决定,但是swf文件则是由它来下载执行的,我的这个就是这个意思;

  回复  引用    
#6楼2006-07-20 13:32 | haijer_[未注册用户]
谢谢版主的思路,我也解决了...第1项问题
  回复  引用    
#7楼2006-07-21 12:30 | haijer_[未注册用户]
版主,我在设计时遇到了一些问题,请教一下。
第一件奇怪的事,我在IE内嵌的情况下,使用AppDomain.CreateInstanceFromAndWrap创建出来的对象只能是该对象的父级对象,比如说一个继承UserControl 的类,我只能获取UserControl而不能得到这个子类的(不能使用子类的函数),同样的情况用本地程序来跑就是正常的。

第二件事,用了你的另一个示例中的Assembly装配及卸载示例方法,创建一个Marshal....什么的继承类,也是在本地程序中正常,然后在IE中会有两种可能,第一直,在直接创建AppDomain.CreateDomain(Name)时,会报文件没找到,在设置路径信息后,则情况与第一件事相同,只有MarshalByRefObject这个接口...请问有什么解决方法吗?

  回复  引用  查看    
#8楼[楼主]2006-07-21 21:12 | 萧寒      
to haijer_

比如我在另一个domain 内创建了一个USERCONTROL,那么对主domain来说,它是通过代理来通讯,原理象remoting,那么你对你所增加的DOMAIN的对象做操作的时候,都需要一个代理,如果要把对象传到主DOMAIN,那这个类必须可被序列化;但是要求所有的WIN USERCONTROL 都被序列化,这不可能做到,所以我采用另外一种办法,用WIN32 API ,直接将HANDLE放到PARENT内,即可。



  回复  引用    
#9楼2006-07-31 17:50 | haijer_[未注册用户]
不好意思,再打扰一下,照楼主的思路基本上都实现了,现在遇到了发布的问题,请问你这边是怎么发布的?能否做成CAB的形式呢?谢谢
  回复  引用  查看    
#10楼[楼主]2006-07-31 21:54 | 萧寒      
cab 的可以做,就是很麻烦;CSDN上有个文章就是讲发布的;不过我还是打包一个MSI安装程序,WEB方式方法,没有采用CAB,因为到时候部署的时候有专人部署,而且点很少,所以就简化了这些工作了
  回复  引用  查看    
#11楼2006-08-11 09:12 | 蛙蛙池塘      
思路不错呀,呵呵。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 446151




相关文章:

相关链接: