在.NET WinForm上运行VB6编写的ocx文件?

6
我继承了一个VB6项目,其中有一个包含VB控件(标签等)和Windows公共控件(树形视图、图像列表等)的窗体,看起来非常适合作为用户控件。
我向同事提到了将其编译为ocx ActiveX控件以在.NET WinForms项目中使用的可能性。他们有些惊讶,因为之前使用VB ocx在C++项目中的经验:在原型制作阶段一切都很好,但在实际使用时会出现时间和刷新问题(对话框上有许多控件,在控件之间切换,停用然后激活对话框等)。
有没有人在.NET Windows Form上使用过VB6编写的ocx?我应该期望微妙的问题还是它们可以很好地协同工作?

有趣的问题。看到关于在.NET表单上使用他们在VB6中编写的OCX的实际经验的答案将特别有趣。 - MarkJ
我想知道使用哪个版本的.NET会有什么不同。 - David T. Macknet
3个回答

2
我很愿意使用微软的Interop Forms Toolkit 2.0从.NET -> VB 6.0进行转换,为此我已经做过很多次。反过来可能会很痛苦。
你的同事所关注的问题是非常真实的。问题在于哪个控件在何时处于焦点状态以及如何在底层处理某些事情。这其中一个典型的例子就是在控件之间切换标签。
考虑一下你有一个.NET表单,其中包含一些.NET控件和一个VB 6 Active X控件。这个ActiveX控件也会有自己的控件。现在当你在.NET表单中切换标签时,当你到达ActiveX控件时,你会期望能够在ActiveX中切换所有的控件,但实际上你不能!你只能整体切换整个ActiveX控件,这是一个问题。
如果你要在VB 6.0中使用.NET,你需要在代码中考虑这种行为。这个CodeProject文章有一个叫做ActiveXHelpers的优秀类来处理这个问题。但基本上,你需要手动处理KeyPressed事件,检查Tab或Shift+Tab,并手动聚焦到下一个/上一个控件。
现在在你的情况下,你需要修改VB 6代码以实现这样的行为。重写.NET控件可能会更容易一些。我从未遇到过刷新问题,但是像我说的那样,我只是从.NET-> VB而不是反过来。无论哪种方式都可能会带来很多痛苦,你很可能会遇到其他问题,例如事件沉没和区分VB中的设计和运行时。

1

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


1
在我们的软件套件中,我们混合使用了VB6和.NET。我们在VB.NET和C#应用程序中使用了许多VB6编写的ActiveX控件。总体而言,它的表现出人意料地好。
我们最大的问题是,当VB6控件的版本更改时,我们必须重新添加.NET项目中的引用。似乎.NET互操作库与控件的特定版本绑定在一起,无法为新版本重新生成互操作性,除非从项目中删除互操作性并重新创建它们。这有点麻烦,但我已经找到了解决方法,不必删除和重新创建所有控件实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接