【发布时间】:2019-07-27 07:28:37
【问题描述】:
我在 VB.NET 中创建了一个 DLL 并在 VB6 中加载。
所有变量和方法都运行良好。
在 DLL 中,我有一个 RaiseEvent。
.NET DLL 中的RaiseEvent 无法触发VB6 中的方法。
Option Explicit On
Option Strict On
Imports System.Windows.Forms
Imports System.Net.Sockets
Imports System.IO
Imports System.Text
Imports System.Net
Imports System.ComponentModel
Imports System.Threading
Imports System.Runtime.InteropServices
<ComClass(TestDLL.ClassId, TestDLL.InterfaceId, TestDLL.EventsId)>
Public Class TestDLL
Public Const ClassId As String = "6E9AB173-14BD-4DE4-9AE0-A9638FCE40B3"
Public Const InterfaceId As String = "E659D166-F952-489F-899F-0104553B44E4"
Public Const EventsId As String = "1C38AB4A-84B9-4CC2-A090-0C272177ECED"
Public Event Disconnected()
Public Event FirstConnect()
Public Event Waagerecht()
Private Sub Received(ByVal msg As String) Handles Me.Receive
RaiseEvent Waagerecht()
End Sub
这个 DLL 在 C#、VB.NET 和 Labview 中运行令人惊叹。只是在 VB6 中没有
VB.NET DLL 中的 RaiseEvent 部分
以及VB6中的代码:
Option Explicit
Private WithEvents MyNetClass As TestDll
Private Sub Form_Load()
Set MyNetClass = New TestDll
End Sub
Private Sub Form_Terminate()
Set MyNetClass = Nothing
End Sub
以及触发方法:
Private Sub MyNetClass_Waagerecht()
MsgBox "Ich werde angezeigt, sobald dll mir was sagt"
End Sub
【问题讨论】:
-
我自己没有尝试在 VB.NET 中编写 COM 可见事件,但我很确定你必须这样做 same thing as in C#。
-
我没有看到明显的东西吗?您的事件在方法
Received中被触发,但在所示的 VB6 代码中永远不会调用该方法,因此永远不会调用MyNetClass_Waagerecht(由事件触发)。 -
VB.NET DLL 中的 RaisEvent 应该触发 VB6 中的方法。这部分在VB: NET DLL: Private Sub Received (ByVal msg As String) Handles Me.Receive RaiseEvent Horizontal() End Sub 并且方法在VB6: Private Sub MyNetClass_Waagerecht() MsgBox "我会尽快显示正如 dll 对我说的那样” End Sub
-
WithEvents MyNetClass在一个类里面吗?如果不是,我相信 WithEvents 在 VB6 中不起作用。 -
Receive事件是否到达辅助线程并因此RaiseEvent Waagerecht在该线程上运行?如果是这样,那可能就是问题所在。使用 Excel VBA 执行此操作时,它似乎可以工作,但 Excel 会在 Dll 上锁定死锁。您可能需要将调用编组回主线程,就像在 WinForms 中使用 Control.InvokeRequired 一样。