首页 > 解决方案 > ComInterfaceType.InterfaceIsIDispatch,早期绑定和VB6

问题描述

我试图了解ComInterfaceType.InterfaceIsIDispatch是如何工作的,可能我误解了一些东西。我有一个 VB6 应用程序,我在 .NET 中实现了一些现代元素,并将其导出到 COM。我声明了 interfaces 并 apply InterfaceType,但我怀疑我是否以正确的方式这样做。对我来说有问题的是ComInterfaceType.InterfaceIsIDispatch. ComInterfaceType Enum的文档说:

InterfaceIsIDispatch - 2 - 指示接口作为分发接口向 COM 公开,它只启用后期绑定。

我做了一个例子,当我在 VB6 项目中添加引用(tlb)时,我也可以使用实现InterfaceIsIDispatch早期绑定的类。

经过一些测试后,我还添加了事件,它适用于两个类。

我错过了什么?

// .NET

[Guid("138A3402-98AF-403D-B24D-0AB08FD79082")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IControllerIDispatch
{
    [DispId(1)]
    void ShowMessage();
}

[Guid("0F0D68FA-C7C4-4112-A2FB-DC3BFED77058")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IControllerDual
{
    [DispId(1)]
    void ShowMessage();
}

[Guid("745B2476-E82C-4ACF-BC79-D0BFA77D9F2E")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface PingEvents
{
    [DispId(1)]
    void Ping();
}

[Guid("653D8882-CFE5-4316-8B2A-395865CCBA05")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(PingEvents))]
[ComVisible(true)]
public class ControllerIDispatch : IControllerIDispatch
{
    public event Action Ping;

    public void ShowMessage()
    {
        MessageBox.Show(nameof(ControllerIDispatch));
        Volatile.Read(ref Ping)?.Invoke();
    }
}

[Guid("57C081B6-2607-4543-834A-77C1C9ECAAE8")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(PingEvents))]
[ComVisible(true)]
public class ControllerDual : IControllerDual
{
    public event Action Ping;

    public void ShowMessage()
    {
        MessageBox.Show(nameof(ControllerDual));
        Volatile.Read(ref Ping)?.Invoke();
    }
}


// VB6 example which works - both classes created using early binding

Dim WithEvents controllerDispatch As ControllerIDispatch
Dim WithEvents controllerDual As controllerDual

Private Sub Form_Load()
    Set controllerDispatch = New ControllerIDispatch
    Set controllerDual = New ControllerDual
End Sub

Private Sub Command1_Click()
    Call controllerDispatch.ShowMessage
End Sub

Private Sub Command2_Click()
    Call controllerDual.ShowMessage
End Sub

Private Sub controllerDispatch_Ping()
    MsgBox "Dispatch Pong"
End Sub

Private Sub controllerDual_Ping()
    MsgBox "Dual Pong"
End Sub

标签: .netcomvb6com-interop

解决方案


推荐阅读