6

我继承了一个 VB6 项目,该项目有一个带有 VB 控件(标签等)和 Windows 通用控件(Treeview、ImageList 等)的窗体,这看起来像是用户控件的理想候选者。

我向一位同事提到了将其编译为 ocx ActiveX 控件以在 .NET WinForms 项目中使用的可能性。由于之前在 C++ 项目中使用 VB ocx 的经验,他们有点害怕:在原型设计阶段一切都很好,但在实际使用时存在时间和刷新问题(对话框上的许多控件、控件之间的选项卡、停用然后激活对话框等)。

有没有人有在 .NET Windows 窗体上使用 VB6 编写的 ocx 的经验?我可以期待一些微妙的问题还是他们在一起玩得很好?

4

3 回答 3

2

为此,我很乐意使用 Microsoft 的Interop Forms Toolkit 2.0从 .NET -> VB 6.0 开始。我已经做过很多次了。走另一条路可能会很痛苦。

你的同事所关心的是非常真实的。随之而来的问题是,哪个控制集中在哪个时间,以及某些想法是如何在幕后处理的。一个典型的例子是跨控件的选项卡。

假设您有一个带有一些 .NET 控件和一个 VB 6 Active X 的 .NET 表单。这个 ActiveX 中也有控件。现在,当您在 .NET 表单中使用选项卡时,当您到达 ActiveX 时,您会期望ActiveX 中的所有控件之间进行选项卡,但您没有!您将一次在整个 ActiveX 控件上进行选项卡。这是个问题。

现在,如果您要反过来,VB 6.0 中的 .NET,您必须在代码中迎合这种行为。这篇CodeProject 文章有一个名为 ActiveXHelpers 的优秀类,它就是这样做的。但基本上它归结为手动处理 KeyPressed 事件,检查选项卡或 shift+tab,以及手动聚焦下一个/上一个控件。

现在,在您的情况下,您需要修改 VB 6 代码以使其具有这样的行为。在 .NET 中重写控件很可能会花费更少的精力。我从未遇到过令人耳目一新的问题,但就像我说的那样,我只使用了 .NET -> VB 而不是相反。无论哪种方式,都可能涉及很多痛苦,并且您很可能会遇到其他问题,例如下沉事件以及在 VB 中区分设计和运行时之间的区别。

于 2009-11-04T11:09:12.340 回答
1

不幸的是,我只有一半的答案。我们在 .NET 窗体上使用单个 VB6 OCX 控件,它可以正常工作。它不与该窗体上的任何其他 .NET 或 OCX 控件一起使用。它提供了一个专门的数据库视图。

于 2009-11-04T13:41:18.463 回答
1

在我们的软件套件中,我们完全混合了 VB6 和 .NET。我们在 VB.NET 和 C# 应用程序中使用了许多 VB6 创作的 ActiveX 控件。在大多数情况下,它的效果出奇的好。

我们最头疼的是,当VB6控件的版本发生变化时,我们不得不在.NET项目中重新添加引用。似乎 .NET 互操作库与控件的特定版本相关联,如果不从项目中删除互操作并重新创建它们,它就无法为新版本重新生成互操作。有点痛苦,但我已经找到了这样做的方法,所以我不必删除并重新创建控件的所有实例。

于 2009-11-05T18:15:52.857 回答