Visual C#创建和使用ActiveX组件

2016-02-19 15:50 21 1 收藏

下面图老师小编跟大家分享Visual C#创建和使用ActiveX组件,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~

【 tulaoshi.com - 编程语言 】

  开发基于.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 服务器版。 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  (2).Visual Studio .Net 2003企业结构版,.Net Framework SDK 4322。

  三.使用Visual C#创建Windows组件:

  以下是使用Visual C#创建一个Windows组件的实现步骤:

  1.启动Visual Studio .Net。

  2.选择菜单||后,弹出对话框。

  3.将设置为。

  4.将设置为。

  5.在文本框中输入。

  6.在的文本框中输入,然后单击按钮,则Visual C#则在"C:Class"目录中创建"ActiveXDotNet"文件夹,里面存放的是ActiveXDotNet项目文件,具体如图01所示:

  图01:创建类库的对话框

  7.选择窗口,并从中上传Class1.cs文件,因为此文件在本程序中已经没有用途了。

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

  图02:在项目中对话框

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  9. 把Visual Studio .Net的当前窗口切换到窗口,并从中的选项卡中往设计窗体中按顺序拖入下列组件:

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

  一个TextBox组件和一个Lable组件。

  10. 把Visual Studio .Net的当前窗口切换到代码编辑窗口,并用下列代码替换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 ) ;}

  至此项目创建的Active X组件的界面就基本完成了,具体如图03所示:

  图03:项目创建的Active X组件的设计界面

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

  

public interface AxMyControl{ String UserText { set ; get ; }}

  12. 在MyControl.cs的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. 单击快捷键,则Visual C#会自动完成编译,并在"C:ClassActiveXDotNetbinDebug"目录生成一个名称为"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:Inetpubwwwroot"。

  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组件的工作。

来源:https://www.tulaoshi.com/n/20160219/1610529.html

延伸阅读
标签: vb
三. 程序设计中的关键步骤以及解决方法: 文中软件主要功能是用通过窗体上的二个按钮来创建二个不同类型的WinForm组件--Button组件和TextBox组件,并在创建的同时为每一个组件的属性赋值,给每一个创建的组件也创建了事件。 (1).如何在窗体上创建Button组件: 其实用Visual C#创建一个组件是十分方便的,只用下列二行语句...
标签: vb
下面是实现上面结果的程序源代码: using System ; using System.Drawing ; using System.Collections ; using System.ComponentModel ; using System.Windows.Forms ; using System.Data ; namespace DynamicControls { public class Form1 : Form { private Button btnAdd ; private System.ComponentModel.Container components = null ;...
一.前言 Visual C#作为一门新兴的编程语言,具有许多其它语言无法比拟的优点。它既有VB的快速简洁,同时又不失C++的高效性能,而且作为一门基于组件编程的语言,它在组件编程方面有着相当强大和完善的功能。本文笔者就通过运用Visual C#编写一个Pop3邮件接收组件向大家介绍如何用Visual C#进行组件编程以及编程过程中的一些方法和技...
标签: vb
以前在用Delphi写程序的时候,总不喜欢在窗体上排放很多组件,这一方面有点不美观,并且在调试程序时候,也不是十分方便。通常在写程序的时候,当要用到某些组件,采用的方法一般都是动态创建,用完以后就释放掉。Visual C#在程序运行的时候也可以动态创建组件,下面就结合一个程序例子来具体介绍如何用Visual C#动态生成组件。首先让我们了...
热衷于C#语言的人会喜欢上Visual C# 2005。Visual Studio 2005为Visual C# 2005带来了大量令人兴奋的新功能,例如泛型、迭代器、局部类和匿名方法等。虽然泛型是人们最常谈到的也是预期的功能,尤其是在熟悉模板的C++开发人员中间,但是其他的新功能同样是对Microsoft .NET开发宝库的重要补充。与C#的第一个版本相比,这些功能和语言附加将会提...

经验教程

792

收藏

92
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部