首页 > 开发 > 综合 > 正文

Visual C#创建和使用ActiveX组件

2024-07-21 02:29:56
字体:
来源:转载
供稿:网友
  开发基于.net平台上的程序员是很难从本质上把visual c#和activex组件联起来,虽然在使用visual c#开发应用程序时,有时为了快速开发或者由于.net framework sdk的不完整,还需要借助activex。但即使如此,也很难把二者联系起来。其中的原因就是能够被visual c#直接使用文件和通过visual c#生成的可执行程序只可能是托管的文件。而active x组件却都是非托管文件。这种文件的差异决定了二者本质"对立"。于是这就引出了本文第一个问题,activex和visual c#到底是何种关系。
 
  一.visual c#和active x组件

  此时可能有些朋友会说,既然能够被visual c#直接使用只能是托管代码文件,那在visual c#中提供的可直接通过引用调用activex又是怎么回事?的确visual c#提供了引用activex组件的操作,这种操作有效的利用了很多以前资源,使得这些资源并没有随着微软推出.net平台而由于平台的差异被"抛弃",但这种在visual c#中引入activex组件的操作其实并不被微软公司所倡导,也不符合微软推出.net的最终目的。这是因为微软之所以推出.net是为了实现跨平台,为了实现"write once and run anywhere",写一遍代码,可以在任何平台上运行的目的。如果程序中使用了active x组件,这也就从另一方面决定了此程序只能在windows平台上使用,也就无法实现微软的"write once and run anywhere"最终目标了。

  再者visual c#提供的引用activex组件的操作,其实active x组件被加入visual c#的"工具箱"时,visual stuio .net其实对activex组件进行了很多操作,而这些操作又都被visual c#隐藏了,使用者往往并不完全清楚。这些操作的作用就是把非托管的activex组件转换成托管的组件,这些操作统称"互操作",细心的程序员可能就会发现,当往程序窗体中拖入activex组件后,源程序所在目录的"bin"目录中就会新增若干个"dll"文件,这些文件就是active x组件进行互操作转换后生成的。此时在visual c#使用的并不是activex组件,而是由activex组件进行互操作得到可供.net平台使用的、功能和原先activex组件相同的类库了。

  既然在visual c#中不能直接使用activex组件,那种看似在visual c#中使用的activex组件其实使用的是经过了互操作后转换的类库。那么visual c#是否能够生成active x组件?本文就来探讨一下visual c#中生成activex组件的实现方法。制作的方法就是首先通过visual c#创建一个windows组件,然后把其接口以com形式发布即可。

  二.本文中介绍的程序设计及运行环境

  (1).微软视窗2000 服务器版。
 
  (2).visual studio .net 2003企业结构版,.net framework sdk 4322。

  三.使用visual c#创建windows组件

  以下是使用visual c#创建一个windows组件的实现步骤:

  1.启动visual studio .net。

  2.选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。

  3.将【项目类型】设置为【visual c#项目】。

  4.将【模板】设置为【类库】。

  5.在【名称】文本框中输入【activexdotnet】。

  6.在【位置】的文本框中输入【c:/class】,然后单击【确定】按钮,则visual c#则在"c:/class"目录中创建"activexdotnet"文件夹,里面存放的是activexdotnet项目文件,具体如图01所示:


图01:创建类库的【新建项目】对话框

  7.选择【解决方案资源管理器】窗口,并从中上传class1.cs文件,因为此文件在本程序中已经没有用途了。

  8.选择【项目】|【添加组件】后,弹出【添加新项】对话框,在此对话框中设定【模板】为"组件类",设定【名称】值为"mycontrol.cs"后,单击【打开】按钮。则在项目文件中新增一个名称"mycontrol.cs"的文件。具体如图02所示:


图02:在项目中【添加新项】对话框
  9. 把visual studio .net的当前窗口切换到【mycontrol.cs(设计)】窗口,并从【工具箱】中的【windows窗体组件】选项卡中往设计窗体中按顺序拖入下列组件:

  一个groupbox组件,并向此组件中再拖入,

  一个textbox组件和一个lable组件。

  10. 把visual studio .net的当前窗口切换到【mycontrol.cs】代码编辑窗口,并用下列代码替换mycontrol.cs中的initializecomponent过程,下列代码是初始化上述加入的组件:

private void initializecomponent ( )
{
 this.groupbox1 = new system.windows.forms.groupbox ( ) ;
 this.txtusertext = new system.windows.forms.textbox ( ) ;
 this.label1 = new system.windows.forms.label ( ) ;
 this.groupbox1.suspendlayout ( ) ;
 this.suspendlayout ( ) ;
 this.groupbox1.controls.add ( this.txtusertext ) ;
 this.groupbox1.controls.add ( this.label1 ) ;
 this.groupbox1.location = new system.drawing.point ( 8 , 8 ) ;
 this.groupbox1.name = "groupbox1" ;
 this.groupbox1.size = new system.drawing.size ( 272 , 56 ) ;
 this.groupbox1.tabindex = 0 ;
 this.groupbox1.tabstop = false ;
 this.groupbox1.text = "visual studio .net创建的active x组件" ;
 this.txtusertext.enabled = false ;
 this.txtusertext.location = new system.drawing.point ( 84 , 20 ) ;
 this.txtusertext.name = "txtusertext" ;
 this.txtusertext.size = new system.drawing.size ( 180 , 21 ) ;
 this.txtusertext.tabindex = 1 ;
 this.txtusertext.text = "" ;
 this.label1.location = new system.drawing.point ( 8 , 24 ) ;
 this.label1.name = "label1" ;
 this.label1.size = new system.drawing.size ( 66 , 16 ) ;
 this.label1.tabindex = 0 ;
 this.label1.text = "输入信息:" ;
 this.controls.add ( this.groupbox1 ) ;
 this.name = "mycontrol" ;
 this.size = new system.drawing.size ( 288 , 72 ) ;
 this.groupbox1.resumelayout ( false ) ;
 this.resumelayout ( false ) ;
}


  至此【activexdotnet】项目创建的active x组件的界面就基本完成了,具体如图03所示:


图03:【activexdotnet】项目创建的active x组件的设计界面

  11. 在mycontrol.cs中的【mycontrol 的摘要说明】代码区中添加下列代码,以下代码是定义一个公用的接口,此接口是告诉com/com+,这儿有一个公用的属性可以进行读写操作:

public interface axmycontrol
{
 string usertext { set ; get ; }
}


  12. 在mycontrol.cs的【mycontrol】class代码区中添加下列代码,以下代码是首先定义一个私有的字符串,用此字符串来保存从web测试页面中传递来的数值定义一个公用属性,在接下来的web测试页面中,将通过这个属性来传递数值,此属性是可读写:

private string mstr_usertext ;
public string usertext
{
 get { return mstr_usertext ; }
 set
 {
  mstr_usertext = value ;
  //修改组件的数值
  txtusertext.text = value ;
 }
}


  13. 保存上面的修改步骤,至此我们就利用visual c#创建了一个名称为mycontrol的class,这也就是用visual c#封装的、酷似active x组件的组件。

  14. 单击快捷键【ctrl+f5】,则visual c#会自动完成编译,并在"c:/class/activexdotnet/bin/debug"目录生成一个名称为"activexdotnet.dll"文件,这就是产生的组件。

  以下是经过上述步骤产生的mycontrol.cs的全部代码:

using system ;
using system.collections ;
using system.componentmodel ;
using system.drawing ;
using system.data ;
using system.windows.forms ;
namespace activexdotnet
{
 public interface axmycontrol
 {
  string usertext { set ; get ; }
 }
 /// <summary>
 /// mycontrol 的摘要说明。
 /// </summary>
 public class mycontrol : system.windows.forms.usercontrol , axmycontrol
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private system.componentmodel.container components = null ;
  private system.windows.forms.groupbox groupbox1 ;
  private system.windows.forms.label label1 ;
  private system.windows.forms.textbox txtusertext ;
  private string mstr_usertext ;
  public string usertext
  {
   get { return mstr_usertext ; }
   set
   {
    mstr_usertext = value ;
    //修改组件的数值
    txtusertext.text = value ;
   }
  }
  public mycontrol ( )
  {
   // 该调用是 windows.forms 窗体设计器所必需的。
   initializecomponent ( ) ;

   // todo: 在 initializecomponent 调用后添加任何初始化
  }
  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void dispose ( bool disposing )
  {
   if ( disposing )
   {
    if ( components != null )
    {
     components.dispose ( ) ;
    }
   }
   base.dispose ( disposing ) ;
  }
  #region 组件设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器
  /// 修改此方法的内容。
  /// </summary>
  private void initializecomponent ( )
  {
   this.groupbox1 = new system.windows.forms.groupbox ( ) ;
   this.txtusertext = new system.windows.forms.textbox ( ) ;
   this.label1 = new system.windows.forms.label ( ) ;
   this.groupbox1.suspendlayout ( ) ;
   this.suspendlayout ( ) ;
   this.groupbox1.controls.add ( this.txtusertext ) ;
   this.groupbox1.controls.add ( this.label1 ) ;
   this.groupbox1.location = new system.drawing.point ( 8 , 8 ) ;
   this.groupbox1.name = "groupbox1" ;
   this.groupbox1.size = new system.drawing.size ( 272 , 56 ) ;
   this.groupbox1.tabindex = 0 ;
   this.groupbox1.tabstop = false ;
   this.groupbox1.text = "visual c#创建的active x组件" ;
   this.txtusertext.enabled = false ;
   this.txtusertext.location = new system.drawing.point ( 84 , 20 ) ;
   this.txtusertext.name = "txtusertext" ;
   this.txtusertext.size = new system.drawing.size ( 180 , 21 ) ;
   this.txtusertext.tabindex = 1 ;
   this.txtusertext.text = "" ;
   this.label1.location = new system.drawing.point ( 8 , 24 ) ;
   this.label1.name = "label1" ;
   this.label1.size = new system.drawing.size ( 66 , 16 ) ;
   this.label1.tabindex = 0 ;
   this.label1.text = "输入信息:" ;
   this.controls.add ( this.groupbox1 ) ;
   this.name = "mycontrol" ;
   this.size = new system.drawing.size ( 288 , 72 ) ;
   this.groupbox1.resumelayout ( false ) ;
   this.resumelayout ( false ) ;
  }
  #endregion
 }
}

  四.visual c#中使用刚封装的active x组件:

  以下步骤就是通过web页面的方式来测试上面创建组件:

  1. 创建一个名称为test.htm文件,mycontrol就是放在此web页面中加以测试的,此文件的内容如下:

<html>
<body color = white>
<hr>

<font face = arial size = 1>
<object id = "mycontrol1" name = "mycontrol1" classid = "activexdotnet.dll#activexdotnet.mycontrol" width = 288 height = 72 >
</object>
</font>

<form name = "frm" id = "frm" >
<input type = "text" name = "txt" value = "请输入数据:" ><input type = button value = "确定" onclick = "doscript ( ) ; ">
</form>
<hr>
</body>

<script language = "javascript">
function doscript ( )
{
 mycontrol1.usertext = frm.txt.value ;
}
</script>
</html>


  2. 把产生的"test.htm"和"activexdotnet.dll"文件全部都拷贝到机器的虚拟目录下,一般来说虚拟目录是"c:/inetpub/wwwroot"。

  3. 打开浏览器,在浏览器的地址栏中输入"http://localhost/test.htm"后,单击"转到"按钮,则会得到如下的运行界面:


图04:测试用visual c#产生的active x组件的运行界面

  至此visual c#产生的active x组件和测试这个组件的全部工作就完成了。

  五.总结:

  虽然本文介绍的方法的确能够方便的解决web页面中很多棘手的问题,本文介绍用visual c#产生的组件的在实用性上的确非常的类似active x组件,但从本质上说,本文产生的组件并不是真正意义上的active x组件。如要使用本文所创建的组件,必须在web页面所在机器上安装.net框架,客户端访问web页面时,也不会真正下载本文介绍的组件,从而也不需要设定计算机的安全级别就能够访问使用此组件的web页面。可见本文产生的组件其实质也是一个托管的代码文件。它只是巧妙的用定义接口的方式来告诉com/com+对象,本组件有一个可供访问的公用属性,通过对此属性的读写操作,完成类似active x组件的工作。菜鸟学堂:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表