Spartakus Skrevet 16. november 2009 Del Skrevet 16. november 2009 (endret) 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 16. november 2009 av Spartakus Lenke til kommentar
GeirGrusom Skrevet 16. november 2009 Del Skrevet 16. november 2009 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. Lenke til kommentar
Spartakus Skrevet 16. november 2009 Forfatter Del Skrevet 16. november 2009 (endret) 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 16. november 2009 av Spartakus Lenke til kommentar
HDSoftware Skrevet 16. november 2009 Del Skrevet 16. november 2009 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 Lenke til kommentar
Spartakus Skrevet 17. november 2009 Forfatter Del Skrevet 17. november 2009 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå