65.9K
CodeProject 正在变化。 阅读更多。
Home

在 VB6 中使用 .NET 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (31投票s)

2007年5月31日

CPOL

4分钟阅读

viewsIcon

209710

downloadIcon

7528

一篇关于在 VB6 中使用 .NET 控件的文章

Screenshot - screenshot.jpg

引言

最近,一个客户询问是否有可能向我们编写的程序添加一些特定功能。 该程序显示了作用在赛车各个车轴上的力和实时数据流。 当时版本只是在 VB6 中有一个 PictureBox 控件,并在图片周围放置了文本框等,以显示这些值。 客户要求整个“图片”根据窗口的大小进行缩放,以便在大屏幕上更容易阅读。

问题

简而言之,编写该应用程序的语言 VB6 对图形的支持不是很好。 尤其是在按比例调整图片大小方面,这是客户的主要要求之一。

解决方案

实施解决方案的时间有限,因此尽管并非完全不可能,但在 VB.NET 中完全重写软件实际上并不可行。 出现的一种可能性是看看是否可以使用 COM Interop 在 VB6 应用程序中使用使用 .NET 编写的控件。 事实证明,这非常容易,但它背后的准备工作揭示了不少死胡同。 因此,本文的目的是为希望完成相同事情的其他人消除这些死胡同。

第一阶段:创建控件

在我们这里,这花了三个阶段中最长的时间,仅仅是因为控件的性质以及计算文本等应该放置的位置。 我不会深入研究我们控件的细节,而只会介绍 VB6 Interop 所需的步骤。

  1. 在 Visual Studio 中创建一个新的 Windows 控件库项目。

    Screenshot - stage1step1.gif

  2. 在属性页的“调试”和“发布”模式下,选中“为 COM Interop 注册”复选框。

    Screenshot - stage1step2.gif

  3. 在 *AssemblyInfo.cs* 文件中,将程序集范围属性 ComVisible 更改为 true。 如果它尚未在配置文件中,请添加它。
    [assembly: ComVisible(true)]

这就是使项目对 VB6 项目可见的全部要求。

属性

关于这些的简短说明:属性暴露给 VB6,所以像 .NET 控件一样,如果您想暴露一个值,您必须将其包装在 Property 表达式中。 您不能只是将其显示为字段。

第二阶段:注册程序集

该库必须在使用 VB6 的客户端计算机上注册。 如果它未在开发计算机上注册,则它在 VB6 的“引用”对话框中将不可见。 如果它未在安装计算机上注册,则类似于您尚未注册经典 DLL 或 ActiveX 控件的问题。“为 COM Interop 注册”复选框在 VS2005 运行时自动执行此注册,但在 VS 关闭时取消注册。

要注册程序集,您必须使用 .NET 等效于 regsvr32 的 regasm。 它位于 framework 目录中,通常是“*C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727*”。 要注册它,请打开命令提示符并运行以下命令,假设 framework 目录和程序集目录位于环境的当前路径中。

regasm.exe Assembly.dll

第三阶段:添加到 VB6 项目

这里的秘诀是 VBControlExtender 对象,它允许在 VB6 窗体上托管 .NET 控件。 但是,第一步是添加对您刚刚注册的程序集的引用。 这可以通过选中“项目”|“引用”菜单中的框来完成。

Screenshot - references.gif

一旦完成,就可以将以下代码添加到项目中窗体的代码中

Option Explicit
Dim car As VBControlExtender

Private Sub Form_Load()
    Set car = Controls.Add("CarControl.Car", "car", Me)
End Sub

演示源文件中包含的其他代码只是根据窗体大小调整控件大小并将随机值设置为控件的属性。

Private Sub Form_Resize()
    car.Left = 100
    car.Width = Me.Width - 300
    car.Top = 100
    car.Height = Me.Height - 700
    car.Visible = True
End Sub

Private Sub timer_Timer()
    ' Randomise the timer
    Randomize
    ' Generate random numbers
    car.object.FrontL = Rnd()
    car.object.FrontR = Rnd()
    car.object.RearL = Rnd()
    car.object.RearR = Rnd()
End Sub

您会注意到我必须通过 car.object 引用 .NET 控件的属性。 这为 VB6 提供了后期绑定功能。 .NET 控件中的所有 COM 可见方法都可以通过此对象访问。 您只需要知道您要键入什么,因为它采用的是后期绑定。

摘要

希望我作为文章撰写者的能力(或缺乏能力)没有掩盖文章的重要部分,以至于无法使用。 我个人认为代码本身说明了一切,并且在附加的 ZIP 文件中包含了所有 .NET 和 VB6 代码,因此请花点时间浏览一下它们。

历史

  • 2007 年 5 月 31 日 -- 发布原始版本
© . All rights reserved.