.NET流水账

一个真正的开明进步的国家,不是一群奴才造成的,是要有独立个性,有自由思考的人造成的。

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  17 随笔 :: 0 文章 :: 28 评论 :: 6 Trackbacks
http://homer.cnblogs.com/archive/2005/01/04/86473.aspx中看到了一篇关于如何名叫“用C#编写ActiveX控件”的文章,受益匪浅。
但该文章可能是在旧版本的.NET开发环境中实现的,在.NET 2005怎么实现也没能成功实现,于是自己从头开始做了一个开发,几经周折终于实现,现在分享给大家。
1、ActiveX在.NET中的实现
 

如上图所示在.NET中使用UserControl来实现ActiveX。代码如下。
 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Drawing;
 5 using System.Data;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.Runtime.InteropServices;
 9 
10 // Add in these    using clauses for this example
11 using System.Reflection;
12 using Microsoft.Win32;
13 
14 
15 namespace ActiveXDotNet
16 {
17      //[ClassInterface(ClassInterfaceType.AutoDual)]
18     public partial class myControl : UserControl, AxMyControl
19     {
20         public myControl()
21         {
22             InitializeComponent();
23         }
24 
25         private String mStr_UserText;
26 
27         public String UserText
28         {          
29             get { return mStr_UserText + " OK"; }
30             set {
31                 mStr_UserText = value;
32                 this.txtUserText.Text = value;
33             }
34         }
35 
36         private void button1_Click(object sender, EventArgs e)
37         {
38             this.txtUserText.Text = "Hello World";
39         }
40 
41         private void button2_Click(object sender, EventArgs e)
42         {
43             InputForm frmInput = new InputForm();
44             frmInput.ShowDialog();
45         }
46 
47     }
48 }
49 

2、其中,将在HTML中使用的方法在接口AxMyControl中实现,代码如下:
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace ActiveXDotNet
 6 {
 7     interface AxMyControl
 8     {
 9         String UserText { set; get; }
10     }
11 }
12 

3、Assembly.cs中的特殊设置:

1 // Setting ComVisible to false makes the types in this assembly not visible 
2 // to COM components.  If you need to access a type in this assembly from 
3 // COM, set the ComVisible attribute to true on that type.
4 [assembly: ComVisible(true)]

这样,一个简单的基于.NET的AticveX控件就开发完成了,下一次讲解具体的调用方法。
posted on 2007-08-01 11:49 DalianGary 阅读(3027) 评论(10)  编辑 收藏 所属分类: VB.NETC#.NET

评论

#1楼  2007-08-01 12:37 xiao_p      
和在03里面实现有区别吗?都是usercontrol吧?

现在这个解决方案应该不是一个很好的选择了吧,因为必须要客户端安装framework,如果强迫客户端装framework,那么用activex的方法实现和用smartclient或者winform的方法实现有什么区别呢?

用RIA等技术实现不是更好的选择吗?
  回复  引用  查看    

#2楼  2007-08-01 12:43 S.Sams      
这个以前以项目中用过, 一直没有搞明白, 如何在 ActiveX 与 JS 的相互通讯问题, 用JS调用ActiveX就比较简单! 如何用 ActiveX 去调用 JS 的函数且执行呢? 看楼主有什么好的建议!
  回复  引用  查看    

#3楼  2007-08-01 15:27 王计平 [未注册用户]
@S.Sams
ActiveX调用JS严格来说不可以。
但是双向通信可以做到的,js调用Ax应该没有问题。如果Ax要调用js代码的话,就是使用“事件”机制来完成的。
by WangJiping@gmail.com
  回复  引用    

#4楼  2007-08-01 15:30 阿毅 [未注册用户]
@S.Sams
引入页面的 window 对象就可以对其操作了,例如:在初始化后由 js 调用该 ActiveX 实例中的方法,传入当前页面的window对象。具体调用 JS 的方法可以参考 mshtml 控件的 javascript 操作相关部分。

项目引用里必须添加对 MSHTML.TLB 的引用,该文件是 msthml 控件的接口定义文件,在%system%目录下。
  回复  引用    

#5楼  2007-08-01 15:39 阿毅 [未注册用户]
补充一点,个人惨痛的经历表明用 .net 开发 activex 是很不保险的。
太多未知数,如果 activeX 与 js 之间异步调用、委托这些的,那就更惨,很多看似不可能出异常的地方会出异常, 很多异常时捕获不到的。卸载前的清理工作、意外场景切换相关控制必须花很大功夫,用C++开发没有过的问题太多了,总之太痛苦了。
  回复  引用    

#6楼  2007-08-01 16:07 代码乱了      
最好避免用.net开发activeX
  回复  引用  查看    

#7楼 [楼主] 2007-08-01 16:16 Guangyu.Ren      
有些时候不是技术人员能说得算得,客户要求必须用.NET的情况也有。
  回复  引用  查看    

#8楼  2007-08-01 17:41 S.Sams      
@王计平
如果这样的话, 其实就是Http的工作方式一样, 单向,由客户端(js)向服务器端(AX)发送请求. 服务器(AX)再回应JS的请求, 这样也是可以的. 但其实这样不科学!
@阿毅
window 对象操作 mshtml 控件, 这个以前用过. 但都是以Winform中引入页面, 这样就可以通过 mshtml 去获取操作页面的DOM对象, 但通过AX再去操作父页面的DOM就没有试过. 回头有时间再确认一下, 估计可行性不高!
  回复  引用  查看    

#9楼  2007-08-03 13:04 A.Z [未注册用户]
给客户做一个windows程序吧,web程序是不可靠的。
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页
社区
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-08-01 16:18 编辑过
成果网网络广告联盟


相关链接: