Vb.net 将vb6中的WithEvents与.Net(VB)dll一起使用

Vb.net 将vb6中的WithEvents与.Net(VB)dll一起使用,vb.net,vb6,Vb.net,Vb6,我已经研究过了,读过了关于这个的所有资料。很可能我已经看到了问题的解决方案,但没有意识到。森林对我来说似乎太厚了 我已经在vb.net-VS2010中编写了一个dll。在vb.net项目中使用时,它可以完美地工作。我已启用COM等,以允许它与VB6一起工作 在我需要这些事件之前,它的工作原理与VB6中的计划一样。但是现在我完全迷失了,我正试图让WithEvents部分发挥作用 当时间比较函数变为真(或相等)时,我的VB.Net dll将引发一个事件。它还返回事件的实际时间 在我的VB6项目中,使

我已经研究过了,读过了关于这个的所有资料。很可能我已经看到了问题的解决方案,但没有意识到。森林对我来说似乎太厚了

我已经在vb.net-VS2010中编写了一个dll。在vb.net项目中使用时,它可以完美地工作。我已启用COM等,以允许它与VB6一起工作

在我需要这些事件之前,它的工作原理与VB6中的计划一样。但是现在我完全迷失了,我正试图让WithEvents部分发挥作用

当时间比较函数变为真(或相等)时,我的VB.Net dll将引发一个事件。它还返回事件的实际时间

在我的VB6项目中,使用WithEvents函数要求声明位于类模块内。我不知道这将/应该如何运作。 正如我前面所说的,我读过的许多帖子都指出它必须在类模块中,但没有一篇文章确切地说明如何用一种干净的直接方法来实现这一点。好吧,至少对我来说是直截了当的

下面的代码是如何在添加事件之前使用dll的。所有属性、操作等均正常工作。它位于.bas模块中

Public PT As New PrecisionTimer.PrecisionTimer
这是如何在表单上使用它的示例:

Private Sub Command3_Click()
Dim aa As Integer

    aa = PT.SetTimerEvent(Val(Text6.Text))
    Select Case aa
        Case -1
            OkToInitiate = True
        Case False
            OkToInitiate = False
    End Select

End Sub
但是现在我需要对dll中的事件做出反应。 下面是VB.Net dll中引发事件的行:

RaiseEvent OTE(ActualTriggeredTime.ToString())
所以,如果有人能帮助我,我真的很难弄清楚如何做到这一点

谢谢

更多信息:

@在某种程度上你是对的,CM从来都不是我的强项。以下是MyClass中的代码:

Option Explicit

Public WithEvents PTM As PrecisionTimer.PrecisionTimer

Private Sub PTM_OTE(ByVal ActualTriggeredTime As Variant)
Dim aa As Integer
   aa = 1
End Sub
现在可以删除PTM_OTE sub,并自动显示新的PTM_OTE sub,当然不需要aa=1代码

在我的Module1.bas中:

Option Explicit
Public PT As New MyClass.PTM
Public OkToInitiate As Boolean
你看到我的代码中有错误吗

在对象浏览器中,我确实看到了OTE事件。在这一点上,我想我应该能够在左上角的代码编辑器下拉列表中看到PT,但我没有

更多信息:
我在VB.NETDLL中的事件例程中添加了一个附加函数-TriggeredFlag

Public Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
   'Other code including basic error handling       
   RaiseEvent OTE(ActualTriggeredTime.ToString())
   TriggeredFlag = True
End Sub
现在,当我在vb6项目中使用dll时,我可以监视TriggeredFlag。它确实如预期的那样发生了变化。然而,这项活动似乎没有受到欢迎。我相信问题出在VB6代码中——类模块中的WithEvents语句(可能)。这是我的整个课堂模块:

Option Explicit

Public WithEvents PTM As PrecisionTimer.PrecisionTimer

Public Sub Class_Initialize()
    Set PTM = New PrecisionTimer.PrecisionTimer
End Sub

Private Sub PTM_OTE(ByVal ActualTriggeredTime As String)
Dim aa As Integer
    aa = 1
End Sub
最后补充信息:

感谢所有帮助解决这个问题的人! 以下是我的模块1.Bas的最终结果:

Option Explicit

Public PT As New PrecisionTimer.PrecisionTimer
Public DT As New DTParams

Public OkToInitiate As Boolean
在表格的“概述”部分:

Option Explicit

Public WithEvents TimerEvents As PrecisionTimer.PrecisionTimer
表单加载例程包括:

Set TimerEvents = PT
这是TimerEvents\u OTE例程:

Private Sub TimerEvents_OTE(ByVal ActualTriggeredTime As String)
'Fires when the "Timer Done" event fires

    Call SetTimerText(ActualTriggeredTime)

End Sub
最后,没有使用类模块


再次感谢大家

尝试使用WithEvents声明PrecisionTimer:

Public WithEvents PT As New PrecisionTimer.PrecisionTimer
然后为以下对象添加事件处理程序:

Public Sub PrecisionTimer_OTE(ByVal ActualTriggeredTime As String) Handles PT.OTE
...
End Sub

WithEvents不必位于类模块中。它可以在

  • 类模块
  • 用户控件
  • 表格
但它不能在模块中

您的命令处理程序(Command3_Click)位于表单中。您可以使用相同的格式声明计时器

Public WithEvents TimerEvents As New PrecisionTimer.PrecisionTimer
由于您在模块中已将其命名为PT,因此我将在表单中使用不同的名称,例如TimerEvents

声明此变量后,可以在编辑器窗口左上角的列表中选择它

然后在编辑器窗口右上角的列表中选择事件

在此之后,VB6将自动插入事件处理程序,您可以在屏幕截图的底部看到

在命令处理程序中,必须在新变量中存储对计时器对象的引用

Set TimerEvents = PT
所以完整的函数应该是这样的

Private Sub Command3_Click()

    Dim aa As Integer

    Set TimerEvents = PT

    aa = PT.SetTimerEvent(Val(Text6.Text))
    Select Case aa
        Case -1
            OkToInitiate = True
        Case False
            OkToInitiate = False
    End Select

End Sub
但是,我想有一个更好的地方可以初始化TimerEvents变量

如果要停止处理事件,请将变量设置为Nothing

Set TimerEvents = Nothing

您似乎不愿意共享您的.Net代码。为了给您一个工作示例,请尝试实现下面的示例,该示例将详细说明创建一个向COM公开的工作类库的步骤。我没有安装VB6,但已使用MS Office VBA对此进行了测试。据我所知,VBA是语言,VB6是语言的宿主。有关此的详细信息,请参阅:

步骤1:创建COM类库。 以管理员身份启动Visual Studio。这样VS就可以在注册表中注册COM组件。 从“空项目(.Net Framework)-Visual Basic”模板创建新项目。我将该项目命名为“Demo-COM-Exposed-Event”。转到“项目属性-应用程序”选项卡,并将“应用程序类型”设置为“类库”。您还可以清除“根命名空间”框以强制所有内容都位于全局命名空间中,但这不是强制性的,因为COM不识别命名空间。

接下来打开构建配置管理器,为项目定义并激活X86(32位)配置

接下来,配置项目以注册COM类。这是在项目属性中的“编译选项卡”上完成的

下面的VB.Net代码定义了
COMDemoClass
。此类公开单个事件(
Event1
)、引发事件的方法(
singlefirevent1
)以及启动/停止可触发
Event1
的计时器的布尔属性(
autofirevent1

导入System.Runtime.InteropServices
输入系统计时器
公共类COMDemoClass
#区域“COM GUID”
'这些GUID提供此类的COM标识
'及其COM接口。如果您更改它们,则现有
'客户端将无法再访问该类。
Public Const ClassId为String=“db10634a-91fe-4cde-a2da-5421578e6142”
公共常数接口ID为String=“22d6da07-b40c-4a04-9551-9c375bf99c06”
Public Const EventsId As String=“2096fe58-d50c-4d19-9039-a6ad4193385c”
#
Option Explicit

Private instance As ExposeVBNetLib  ' a variable to keep the class reference alive between methods

Sub CreateAndLaunch()
   Set instance = New ExposeVBNetLib
   instance.SingleFireEvent1 "It works"
   instance.AutoFireEvent1 = True
End Sub

Sub ShutDown_instance()
   If Not (instance Is Nothing) Then
      instance.AutoFireEvent1 = False
      Set instance = Nothing
   End If
End Sub