2016-07-24 9 views
1

Let in VB6 sagen, ich habe eine Array-Liste, die etwa wie folgt aussieht:Pass Arraylist von VB6 zu vb.net Objekt

Public Type ArrayList 
    str1 As String 
    str2 As String 
    str3 As String 
End Type 

Dim dataList() As ArrayList 

dataList(0).str1 = "String 1" 

, dass etwas, das ich in einem VB6-Objekt zu füllen. Jetzt möchte ich das an mein vb.net-Objekt weitergeben.

definiert ich eine Immobilie in vb.net Public Property WarrantyDetails As ArrayList ...

genannt Aber wenn ich mein Objekt verweisen gibt es Pop-up-Fehler:

Error description

ist die einfachste Methode ist, Daten von VB6 Objekt übergeben .net Objekt? Alles andere als multidimensionales Array?

+1

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 –

+0

Es funktioniert nicht, auch wenn ich den Namen des Typs ändern –

Antwort

0

enter image description here

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