Avatar billede gonnemand Nybegynder
17. februar 2009 - 11:41 Der er 3 kommentarer og
1 løsning

String reference mellem C# og VB

Jeg har en string i C#, som jeg vil putte med som en parameter til function i VB.
I VB functionen, får jeg C#'s string over, med den tekst der nu er i den, og jeg kan også ændre indeholdet i den string.

Problemet er bare, at selv om jeg i VB tager den som: ByRef C#String As String, så ændringer af C#String i VB, ikke ses i C#, hvilket jeg vil mene at man burde kunne, da det er en ByRef.

Mit VB kode ligger i Modules til en excel fil som "myModule"
I dette modul, ligger så følgende kode:
____________________________________
Option Explicit

Public Function myFunc(ByRef ark As Worksheet, ByRef myString As String) As Boolean

'do something

myString = myString & " tekst fra VB"
myFunc = True
End Function
____________________________________
I C# har jeg så følgende kode, som kalder myFunc i VB:

//updated er selvfølgelig en boolean
//XLApp er en tråd til Excel app
String myString = "Tekst fra C#";
updated = (Boolean)XLApp.Run(myModule.myFunc,
                    ws, myString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
____________________________________
Efter at myString ("Tekst fra C#") har været ovre i VB, og deri fået tilføjet (" tekst fra VB"), så ses denne tilføjelse ikke i C#.
Hvad gør jeg lige forkert?? :-(

PS. jeg VED at myString kommer over i VB, for jeg kan skrive indeholdet af den ud. Det er bare lige som om at det der ByRef kun virker den ene vej.... eller noget :-(
Avatar billede erikjacobsen Ekspert
17. februar 2009 - 11:46 #1
Hvis de ikke deler adresserum, kan man ikke lave en byref. Måske kan du (det er udenfor mit eget erfaringsgrunlag):

<Out( )> ByRef y As string

Blog du husker:
  Imports System.Runtime.InteropServices
Avatar billede gonnemand Nybegynder
17. februar 2009 - 12:32 #2
Det kan man ikke, da det ikke er .NET VB jeg sidder med. Ved faktisk ikke helt hvad det så er. Men det er i det man får, når man trykker ALT+F11 i excel. Jeg har så bare lavet et modul, som andre excel filer referere til, og kan på den måde bruge dens funktioner.
Avatar billede erikjacobsen Ekspert
17. februar 2009 - 12:45 #3
Ok - min fejl. Men det gælder stadig: hvis de ikke deler adresserum, kan man ikke bruge en byref. Jeg er ikke ligefrem ekspert i dit setup.
Avatar billede gonnemand Nybegynder
21. februar 2009 - 18:37 #4
Det lykkedes aldrig at få problemet lavet. I stedet blev VB functionen lavet om til at returnere en string i stedet for en boolean:

Public Function myFunc(ByRef ark As Worksheet) As String

// DO SOMETHING

if successful -> myFunc = true

else -> myFunc = false

Og så putter jeg eventuelle fejlmeddelelser i denne streng også,
så jeg i C# blot tjekker på hvad strengen starter med (true eller false) og kører så videre ud fra det.
Det virker ganske udemærket :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester