.net - 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
解决方案
推荐阅读
- python - 键入提示以确保界面
- python - 如何计算 OpenCV4 中轮廓图像的面积?
- c++ - 使用 RInside 重用 RStudio 环境
- c - MAC Sierra 代码块:无法运行可执行文件
- dpdk - DPDK 接口的统计信息
- google-apps-script - 如何使用长格式脚本将值从 goole 表复制到谷歌文档?
- postgresql - 控制 AWS RDS Posgres 故障转移条件/标准
- java - Spring Webflux - 即使第一个 Mono 响应错误信号,链接的 Mono 也得到解决
- javascript - 白板问题,我的数组仍在解决方案中排序
- php - ldap_connect 不能使用连接字符串,除非端口被指定为第二个参数