A „benutzerdefinierter Typ in einem öffentlichen Objektmodul definiert“ bedeutet ein VB6 Klassenmodul die Art und Weise ähnlich Vb.Net Klassen VB.Net Benutzertypen definieren. Ich habe VB6 nicht installiert, aber in seiner Cousin-Sprache VBA machen Sie die Klasse öffentlich, indem Sie die Eigenschaft "Instancing" festlegen. Der gesamte unten dargestellte Code wurde mit VBA getestet, daher sollte er auch in VB6 funktionieren.
Anstatt einen UDT zu deklarieren, deklarieren Sie ein VB6-Klassenmodul.
' clsDemo
Option Explicit
Private str1_ As String
Private str2_ As String
Private str3_ As String
Public Property Get str1() As String
str1 = str1_
End Property
Public Property Let str1(var As String)
str1_ = var
End Property
Public Property Get str2() As String
str2 = str2_
End Property
Public Property Let str2(var As String)
str2_ = var
End Property
Public Property Get str3() As String
str3 = str3_
End Property
Public Property Let str3(var As String)
str3_ = var
End Property
Auf der VB.Net Seite erklären Sie, eine „COM-Klasse“ mit einer Methode eine Instanz der VB6 Klasse zu erhalten. Beachten Sie, dass diese VB.Net-Klasse mit Option Strict Off
deklariert wird, um spätes Binden an die VB6-Objektelemente zu ermöglichen.
Option Strict Off
Imports System.Runtime.InteropServices
Namespace Global
<ComClass(Class1.ClassId, Class1.InterfaceId, Class1.EventsId)> _
Public Class Class1
Public Const ClassId As String = "0bf2556f-cc0f-420a-9ec5-a209fc967773"
Public Const InterfaceId As String = "9c758eae-8eb0-4593-91cf-6a494fdcabb1"
Public Const EventsId As String = "318f0ee0-8d5f-49b7-baa9-83cb8737cf57"
Public Sub ReceiveVBAClass(obj As Object)
MsgBox("str1 = " & obj.str1)
End Sub
Public Sub ReceiveVBAClassCollection(collection As Object)
For Each o As Object In DirectCast(collection, System.Collections.IEnumerable)
MsgBox("str1 = " & o.str1)
Next
End Sub
End Class
End Namespace
Auf der VB6 rufenden Seite, würde der Code ähnlich der folgenden sein:
Sub TestToNet()
Dim c1 As New TestReceiveVBAClassInstance.Class1
Dim f As New clsDemo
f.str1 = "hi"
c1.ReceiveVBAClass f
End Sub
Sub TestToNet2()
Dim coll As New Collection
Dim f As clsDemo
Set f = New clsDemo
f.str1 = "hi"
coll.Add f
Set f = New clsDemo
f.str1 = "there"
coll.Add f
Dim c1 As New TestReceiveVBAClassInstance.Class1
c1.ReceiveVBAClassCollection coll
End Sub
Arraylist ist ein reserviertes Wort, so dass es keine gute Idee ist Ihre eigene Art, wie diese zu nennen. Übergeben eines Arrays sollte in Ordnung funktionieren –
Es funktioniert nicht, auch wenn ich den Namen des Typs ändern –