当前位置 > 首页 > Asp.net

VB调用C#写的WinForm.NET控件

12/9/2012 3:41:00 PM来源:Asp.net

点击下载本文配套的演示程序代码http://files.cnblogs.com/xdesigner/VB-CS-WinformControl.zip

一.前言:

  虽然IT开发技术日新月异,不过业界仍然运行着大量的VB系统,这些系统凝聚了不少客户的投资,应当要一定程度的保护和利用。因此也就产生了一种需求,也就是使用旧的开发技术仍然可以使用新技术的产出。本文就讨论如何在VB6.0开发中使用上WinForm.NET控件。[袁永福版权所有]

 

二.软件原理:

  运行VB IDE,打开或创建一个EXE工程,打开窗体设计器,如下图所示: 

  为了能在窗体上添加控件,需要往窗体左边的工具箱上添加项目,需要点击菜单项目“Project-Components”,此时会弹出如下图所示的对话框: 

   点击“Browse”按钮,弹出文件选择对话框,这个对话框中优先选择OCX文件,而C#编译结果绝不可能是OCX文件的,此时即使选择一个.NET程序集DLL文件,无论如何必然会报错“This file not registerable as an ActiveX Component”。[袁永福版权所有]

  因此也就是说,使用C#开发的WinForm.NET控件是不可能直接通过传统的模式放置在VB窗体上。

  不过VB仍然可以通过COM方式调用.NET程序集中的对COM公开的类型。此时就可以想出一种曲线实现方式,那就是VB创建C#组件,该组件是一个WinForm.NET控件,然后调用Win32API SetParent函数,将WinForm.NET控件硬塞入VB窗体中。这样在用户界面上,用户能看到和使用WinForm.NET控件;在后台,VB代码能访问.NET组件提供的公开的属性、方法和事件,实现了VB全方位的调用WinForm.NET控件。 

三.C#开发

C#控件开发

  根据上述的软件原理,笔者开发一个WinForm.NET控件并成功的应用于VB6.0的开发中,现对软件进行说明。

  这个WinForm.NET控件名为MyWinFormControl,派生自System.Windows.Forms.UserControl类型,它包含在一个名为DCWinFormControlLib的C#项目中,项目输出类型为类库,目标框架为.NET2.0,添加了对System.Windows.Forms.dll的引用。

界面设计:

MyWinFormControl控件的用户界面设计如下: 

  在界面上放置一个名为“btnAction”的按钮,一个名为“myTextBox”的文本框。

定义公开属性和方法:

  打开该控件的C#代码文件,可以看到声明该类型的C#代码如下:

[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.Guid(
"60550064-C97F-4306-A8B2-6908F50780E3")]
[System.Runtime.InteropServices.ComSourceInterfaces(
typeof(IComMyEvent))]
public partial class MyWinFormControl : UserControl
{
}

  这段代码中,第一行代码的ComVisible标记类型为COM公开的;第二行代码Guid标记了类型在COM中的唯一编号;第三行代码的ComSourceInterfaces指明该类型实现了名为IComMyEvent的事件接口。[袁永福版权所有]

  VB中无法直接绑定编译阶段未知的控件事件,同时也无法直接感应C#中的事件,为此需要编写一个接口通知VB存在若干事件,使得VB能绑定事件。因此在此定义了IComMyEvent接口,声明了C#控件中的事件,IComMyEvent接口定义如下

using System.Runtime.InteropServices;

[Guid(
"096EF9A6-24CB-4091-A18F-34DA38C9A6F1")]
[ComVisible(
true )]
[InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
public interface IComMyEvent
{
/// <summary>
/// 按钮按下事件
/// </summary>
[DispId(12340)]
void ComButtonClick();
/// <summary>
/// 文本内容修改事件t
/// </summary>
[DispId(12350)]
void ComTextChanged();
}


/// <summary>
/// 无参数无返回值委托类型
/// </summary>
public delegate void VoidEventHandler();

而后在控件的C#代码中添加以下代码:

#region 实现 IComMyEvent 中的成员
/// <summary>
/// 按钮按下事件
/// </summary>
public event VoidEventHandler ComButtonClick = null;
/// <summary>
/// 文本内容修改事件
/// </summary>
publ

  • jre6的webservice使用Php类库nusoap调用的问题

    2/2/2010 7:22:00 AM

    阅读: 399 评论: 1 作者: Birdshover 发表于 2010-02-01 18:13 原文链接 jre6.0加入了对WebService的支持,不用再用开源类库了。 看

  • 大数据量插入

    5/7/2009 9:07:00 PM

    这段时间在做抓包项目,需要把抓来的数据插入到数据库中,特做了四种插入数据算法比较。 数据库: SQL Server Management Studio Express 数据库名:

  • .Net调试技巧

    6/14/2011 10:54:00 PM

    部门内部培训的PPT,版权属于我同事(这里不公布姓名)了,已征的本人同意。 Net调试 View more presentations from breezeli

  • SubSonic中使用TransactionScope

    6/25/2007 11:49:00 AM

    摘要: SubSonic使用起来非常像Rails中的ActiveRecord,不仅将代码生成工具集成到了IDE中,而且还可以自己来定制模板。虽然还存在问题,但现在的版本是可以满足日常开发了。 由于

  • Maybe Monad… my C# version

    9/4/2009 1:49:00 PM

    Functional programming isn’t a new concept. There is Scheme, Haskell and a bunch of other really

  • Dotnetrocks!!!

    1/18/2010 3:05:00 PM

    Dotnetrocks is a cool internet audio talk show for .Net developers. In DJ Style with cool musical e

  • WinCE数据通讯之Web Service分包传输篇

    7/13/2009 2:03:00 PM

    前面写过《WinCE数据通讯之Web Service篇》那篇对于数据量不是很大的情况下单包传输是可以了,但是对于大数据量的情况下WinCE终端的内存往往会在解包或者接受数据时产生内存溢出。具体在多大

  • 本地运行ASP.NET 网站组件CYQ.IIS发布--网站项目展示必备工具

    6/23/2011 4:15:00 PM

    前言: 曾经,为了让 秋色园 更方便的在本地运行部署,辛苦写了一个“秋色园 QBlog 博客一键安装工具技术实现[附源码下载]”。 不过这个工具也有一些不

  • Excel 二次开发系列(6): 引用Excel模板

    10/27/2009 4:01:00 PM

    阅读: 450 评论: 1 作者: tomin 发表于 2009-10-27 12:36 原文链接 Excel 二次开发系列 C# 这一节,主要有两个方面

  • 使用iBatis和ObjectDataSource轻松实现分页

    6/24/2007 10:06:00 PM

    摘要: 利用iBatis的方法配合ObjectDataSource控件可以很容易地实现比较通用的分页方案. 阅读全文 Anders Cui 2007-06-21 19:13 发表评论