日期:2014-05-18  浏览次数:20798 次

[转]使用C#开发ActiveX控件全攻略

[转]使用C#开发ActiveX控件全攻略
2010年08月03日
  先说说ActiveX的基本概念。 
  根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。 
  ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。 
  目前支持ActiveX的主要是IE浏览器。 
  以前ActiveX开发普遍使用VC++或VB,随着C#和.net的发布,用C#开发ActiveX控件变得更方便、更简单。但需要注意的是用C#开发 的ActiveX控件需要客户机装有.net framework,有点郁闷。可是相对.net强大的功能良好的易用性,这点牺牲还是值得的,况且现在好多计算机已经安装有.net framework了。 
  其实.net下的winform控件也是可以直接嵌入到web网页里的,但是由于.net安全性的限制,无法在客户端实现复杂的操作,比如磁盘空间操作和注册表操作。因为ActiveX控件是以本地用户的身份运行,可以突破.net安全性的限制,所以开发ActiveX控件还是很必要的。 
  C#写ActiveX控件的原理很简单,就是使用了.net平台和COM的互操作性。修改项目属性的目的就是将.net控件注册为com。这样,你就可以把这个控件完全当作ActiveX控件来对待了。比如,可以使用JS和VBS来调用,也可以使用C++来调用。 
  下面一步步来实现C#写ActiveX控件。 
  第一部分:用vs2008制作一个winForm控件 
  用vs2008建立一个新的"windows窗体控件库"命名为"WindowsFormsControlLibrary1"如下图 
  
  点击确定后,将UserControl1.cs更名为demo.cs。向界面里添加一个Labal、一个TextBox和一个Button,相应的修改控件属性。如下图: 
  
  为button1添加Click事件,代码如下: 
  private void button1_Click(object sender, EventArgs e) 
  { 
  label1.Text = textBox1.Text; 
  } 
  在AssemblyInfo.cs中引用System.Security命名空间,并添加一句: 
  [assembly : AllowPartiallyTrustedCallers()] 
  好,现在编译整个工程,生成\bin\Debug\WindowsFormsControlLibrary1.dll,我们的winform控件就做好了。 
  下面在解决方案里添加一个web应用程序的工程,名为WebApplication1,用来测试我们的控件。 
  将WindowsFormsControlLibrary1.dll拷贝到WebApplication1所在的目录下。然后在Default.aspx 里面加入" 
   
  ok,编译运行后你将看到如下界面: 
  第二部分:把这个winForm控件转换为ActiveX控件 
  到目前为止,我们所实现的只是winform控件,还不是真正的ActiveX控件。 
  鼠标右键,打开WindowsFormsControlLibrary1的工程属性,在"应用程序"里点击"程序集信息..."显示如下界面: 
  
  选中"使程序集COM可见",然后确定。 
  进入"生成"页面,如下图: 
  
  选中"为COM互操作注册"。 
  重新编译工程,这时WindowsFormsControlLibrary1.dll就变成了一个ActiveX控件。 
  我们使用 工具-〉OLE/COM对象查看器查看(没有的话到C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin目录下找到OleView.Exe,在工具-》外部工具可以添加的,这个我在这里就不多说了),如图: 
  
  WindowsFormsControlLibrary1.demo已经被正确识别为COM组件。现在,我们已经可以像使用其它ActiveX控件一样在 网页中显示了。在WindowsFormsControlLibrary1.demo点击鼠标右键,选择Copy HTML  Tag to Clipboard,可以将代码拷入剪贴板。 
  我们在 Default.aspx  中粘贴剪贴板的内容,如下: 
    
   
  编译运行整个工程,我们会在网页中看到之前的内容。好,现在我们的控件已经是货真价实的ActiveX控件了。 
  第三部分:实现ActiveX控件与网页的交互 
  我们在Demo中加入s1属性: 
  private string _s1; 
  public string s1 
  { 
  get 
  { 
  return _s1; 
  } 
  set 
  { 
  _s1 = value; 
  } 
  } 
  我们在Demo中加入ShowMessage方法: 
  public void showMessage() 
  { 
  MessageBox.Show(_s1);          }  修改Default.aspx  中的内容: 
   
     
   
   
   
  好,编译运行整个工程,显示如下: 
  
  点击单击"用js和控件交互"按钮,应该可以实现交互了。 
  但是结果却很遗憾,我们发现IE跳出了对话框,如图所示 
  
  这时我们通过修改IE安全属性"对没有标记为安全的ActiveX控件进行初始化和运行"可以绕过这个问题,但是要真正解决需要实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件。 
  首先在工程里添加一个接口,命名为IObjectSafety.cs,代码如下: 
  using System; 
  using System.Runtime.InteropServices; 
  namespace WindowsFormsControlLibrary1 
  { 
  [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),Inte rfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
  public interface IObjectSafety 
  { 
  void GetInterfacceSafyOptions(