【问题标题】:Extend a VB6 interface with events in c#在 c# 中使用事件扩展 VB6 接口
【发布时间】:2015-06-24 14:06:09
【问题描述】:

您好,我有一个名为 CLSFW_SBSession 的 vb6 接口,其中包含一个事件:

Public Event DataTransfer(ByVal Data As Variant)

Public Property Get ActionID() As Long
End Property

...

我需要用一个 c# 互操作类来扩展它。我试过了:

[ComVisible(true)]
[Guid("ddb976bd-fe29-44d5-a163-e7780a4bb897")]
public class ClsSbSession : FWBO_LibSrv.CLSFW_SBSession
     public event __CLSFW_SBSession_DataTransferEventHandler DataTransfer;
     ...

现在,如果我在 vb6 中声明一个这种类型的对象并实例化它,而不使用事件,它就可以工作:

Private session As FWBO_LibSrv.CLSFW_SBSession
Set session = new ClsSbSession()

但如果我使用:

Private WithEvents session As FWBO_LibSrv.CLSFW_SBSession

我尝试实例化它:

Set session = new ClsSbSession()

我收到一个错误:

对象或类不支持事件集

如何管理来自 c# 类的 vb6 的事件?谢谢

【问题讨论】:

    标签: c# events vb6 interop


    【解决方案1】:

    我有一个vb6界面

    这很模糊,VB6 不允许声明接口。它确实从 VB6 类声明中生成它们,它们的名称以下划线开头。应该有两个,一个用于班级,可能命名为_CLSFW_SBSession,另一个用于活动。查找这些接口名称的一种方法是从 Visual Studio 命令提示符运行 Oleview.exe。使用 File + View Typelib 并选择 VB6 可执行文件。找到 coclass 声明并注意由 [default] 和 [source] 属性标记的接口。

    您需要从 [default] 接口派生您的类。并且您必须使用 [ComSourceInterfaces] 属性来命名 [source] 接口。 MSDN 如何页面is here。尚不清楚为什么要尝试模仿 VB6 类,仅当您需要替换现有 VB6 类并且需要保持旧客户端程序运行时才有必要这样做。这有额外的要求,比如匹配向导。

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多