ComInterfaceType.InterfaceIsIDispatch,早期绑定和VB6

问题描述

我试图了解ComInterfaceType.InterfaceIsIdispatch的工作方式,可能是我误解了。我有一个VB6应用程序,我正在.NET中实现一些现代元素,然后将其导出到COM。我声明了接口并应用了InterfaceType,但是我怀疑是否以正确的方式进行操作。对我来说有问题的是ComInterfaceType.InterfaceIsIdispatchComInterfaceType Enum的文档说:

InterfaceIsIdispatch-2-指示接口公开给COM 作为一个dispinterface,只能启用后期绑定。

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

经过一些测试,我还添加了event,它对于两个类都适用。

我缺少什么?

// .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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)