从C#模态形式显示VB6模态形式时,事件不会触发?

Dav*_*Caz 6 c# vb6 com com-interp

编辑 -我发现当VB6程序运行编译时,事件正常工作,没有问题。

只有当代码在VB6 IDE中运行时,事件才会中断!

这不能完全解决问题,因为如果我们不能在IDE中进行调试,那将是非常低效的开发。但是也许它可以提供更多的根本原因的见解。我猜想,如果可能的话,需要进行的修复是使事件在IDE中正常/正确地工作。


我正在使用两个环境之间的COM互操作从模态C#Winform加载模态VB6表单。在这种配置(模态到模态)下,不会以VB6格式触发任何事件,例如。甚至没有Form_Load。

如果表单是非模式加载的,那么事情就可以正常工作,但是当然这不能很好地满足UI要求。

我想了解这个问题的根本原因,以及如果可以采取任何措施,该怎么办。我在这里包括了我可以想到的问题的最基本的再现。

该体系结构是将协调对象从VB6传递到C#代码,该代码充当包装器以显示VB6形式。

事件顺序:

  1. VB6主程序启动
  2. VB6创建一个(C#)ModalCSForm对象并将其对VB6Bridge对象的引用设置为
  3. VB6拨打电话以显示 ModalCSForm
  4. ModalCSForm 显示
  5. 用户点击按钮 ModalCSForm
  6. 按钮单击处理程序使用VB6Bridge对象显示ModalVB6Form
  7. ModalVB6Form 显示
  8. 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();
}
Run Code Online (Sandbox Code Playgroud)

界面IVB6Bridge:

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IVB6Bridge
{
    void ShowVB6FormModally();
}
Run Code Online (Sandbox Code Playgroud)

VB6项目:

主程序:

Sub main()
    Dim m As New ModalCSForm

    Set m.Bridge = New VB6Bridge
    Call m.ShowDialog
End Sub
Run Code Online (Sandbox Code Playgroud)

ModalVB6Form 码:

Private Sub Form_Load()
    Label1.Caption = ""  'Doesn't occur, remains "ERASE ME"
End Sub
Run Code Online (Sandbox Code Playgroud)

类VB6Bridge:

Implements IVB6Bridge

Private Sub IVB6Bridge_ShowVB6FormModally()
    ModalVB6Form.Show FormShowConstants.vbModal
End Sub
Run Code Online (Sandbox Code Playgroud)

我在下面提供了一个截图来演示该问题。显然,“ ERASE ME”一词实际上并没有被删除,这应该是在加载表格时首先发生的事情。同样,在断点Form_Load,Form_Initialize或在VB6表单代码什么都不会被击中。

在此处输入图片说明