Gå til innhold

[Løst] Konvertering av .NET object[] til VB6 Variant()


Anbefalte innlegg

Hei,

 

har en liten case med .NET sine 0-indexerte arrays og VB6 sine 1-indexerte Variant arrays.

 

Jeg har importert en VB6-dll inn i mitt .NET prosjekt, og VS lager automatisk en wrapper til meg på dette som jeg kan bruke for å kalle den opprinnelige VB6-komponenten.

 

Wrapperen har gjort om Variant() -> ref System.Array.

VB6: ByRef r_AccCols()

NET: ref System.Array r_AccCols

 

Jeg har en object[] "myArray" med verdier jeg skal sende til VB6-funksjonen.

jeg kan ikke bruke myArray direkte i VB6-kallet, jeg må konvertere den til en System.Array først. Greit, da er det vel bare å gjøre dette:

System.Array arr1 = myArray;

 

Problemet da er at min VB6-komponent mister første index da den leser fra index 1 og utover og endring i VB6-koden er uaktuelt pga at den brukes i mange ulike sammenhenger. Grunnen til at myArray er av typen object[] er pga begrensninger i modulen som skal kalle min .NET-wrapper.

 

Hvordan kan jeg enkelt legge på en tom index i forkant i myArray?

Ser for meg at jeg må loope alle arrays jeg sender og "mekke" litt på dem, men håpet det var en mer smidig måte...

Endret av Spartakus
Lenke til kommentar
Videoannonse
Annonse
Du kan jo prøve å bruke 0 base i VB6?

Dim MyArray(0 To 99) As Variant

 

Men ellers er det System.Runtime.Marshal som gjør at du kan konvertere objekter fra COM til tilsvarende .NET objekt.

Greia er at jeg ikke kan endre VB6-koden, den må være som den er. Dermed ligger ansvaret for å sende korrekt data i min wrapper.

 

I .net interfacet er den aktuelle parameteren definert slik:

[In, Out, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array r_AccCols

 

Hmm...flere kjepper i hjula her:

Dette funker:

Array arr2 = new object[] { "", "test1", "test2" };

Men ikke dette:

Array arr2 = AccCols; // (definert som object[] i funksjonskallet)

Får da:

Specified array was not of the expected type.

Exception has been thrown by the target of an invocation.

 

Det jeg altså er ute etter er å konvertere object[] -> System.Array hvor index 0 er tom, eks

object[0] = "hei"

object[1] = "på"

object[2] = "deg"

Konvertert til System.Array med index fiks:

index 0 = ""

index 1 = "hei"

index 2 = "på"

index 3 = "deg"

 

 

Edit:

 

Løst:

Konverterte object[] til en List<object> og tilbake til object[] igjen:

List<object> l = new List<object>();

l.Add(""); //Legger på tom verdi på første index

l.AddRange(AccCols); //Legger til alle verdier fra opprinnelig array

System.Array arr1 = l.toArray(); //Konverterer alt tilbake til object[]

Endret av Spartakus
Lenke til kommentar
Du sier du ikke kan endre noe, men hva med å legge til noe?

Som å legge til en funksjon som du kan bruke fra .NET siden, og i VB6 bare legge til 1 når du henter rett verdi i arrayen

Niks, fjerne/endre/legge til er fyfy :) Uansett, løste det selv til slutt.

 

Greia er at VB6-komponenten er en extension A som program B lar deg programmere for å lage spesiallogikk for kunde C. Min wrapper D skal kunne funke på alle implementasjoner av A.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...