问题描述
我试图了解ComInterfaceType.InterfaceIsIdispatch
的工作方式,可能是我误解了。我有一个VB6应用程序,我正在.NET中实现一些现代元素,然后将其导出到COM。我声明了接口并应用了InterfaceType
,但是我怀疑是否以正确的方式进行操作。对我来说有问题的是ComInterfaceType.InterfaceIsIdispatch
。 ComInterfaceType 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 (将#修改为@)