EDIT- 我发现当VB6程序编译运行时,事件工作正常,没有问题。
只有当代码在 VB6 IDE 中运行时,事件才会被破坏!
这并不能完全解决问题,因为如果我们不能在IDE中调试的话,开发效率会非常低;但也许它可以让我们更深入地了解根本原因。我猜想需要的修复(如果可能)是让事件在 IDE 中正常/正确工作。
我正在从模式 C# Winform 加载模式 VB6 表单,在两个环境之间使用 COM 互操作。在此配置中(模态到模态)VB6 表单中不会触发任何事件- 例如,。甚至不Form_Load
.
如果表单以非模式方式加载,那么一切都会正常工作,但这当然不能很好地满足 UI 要求。
如果可能的话,我想了解这个问题的根本原因,以及是否可以对此采取措施。我在这里包含了我能想到的问题的最基本的再现。
该体系结构是一个协调对象从 VB6 传递到 C# 代码,该代码充当显示 VB6 表单的包装器。
事件顺序:
- 主 VB6 程序启动
- VB6 创建一个 (C#)
ModalCSForm
对象并设置其对 a 的引用VB6Bridge
object
- VB6调用显示
ModalCSForm
-
ModalCSForm
显示
- 用户点击按钮
ModalCSForm
- 按钮单击处理程序使用
VB6Bridge
要显示的对象ModalVB6Form
-
ModalVB6Form
显示
- VB6 中不会发生任何事件。 VB6 代码中不会命中断点。
C# 项目:
班级/形式ModalCSForm
:
[ClassInterface(ClassInterfaceType.AutoDual)]
public partial class ModalCSForm : Form
{
...
public IVB6Bridge Bridge { get; set; }
private void button1_Click(object sender, EventArgs e) =>
Bridge.ShowVB6FormModally();
}
界面IVB6Bridge
:
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IVB6Bridge
{
void ShowVB6FormModally();
}
VB6项目:
主要程序:
Sub main()
Dim m As New ModalCSForm
Set m.Bridge = New VB6Bridge
Call m.ShowDialog
End Sub
ModalVB6Form
code:
Private Sub Form_Load()
Label1.Caption = "" 'Doesn't occur, remains "ERASE ME"
End Sub
Class VB6Bridge
:
Implements IVB6Bridge
Private Sub IVB6Bridge_ShowVB6FormModally()
ModalVB6Form.Show FormShowConstants.vbModal
End Sub
我在下面提供了一个屏幕截图来演示该问题;显然,文本“ERASE ME”实际上并未被删除,这应该是表单加载时首先发生的事情。同样,断点Form_Load
, Form_Initialize
,或 VB6 表单代码中的任何其他内容都不会被命中。