Structure-Größe ändert sich nach Konvert

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Bianco.

    Structure-Größe ändert sich nach Konvert

    Hallo Leute,

    mein derzeitiges Projekt besteht daraus, ein bestehendes VB6 Projekt in ein VB.NET Projekt zu konvertieren.

    Nun zu meinem Problem.

    Ich versuche eine Structure zu erstellen, die die selben Werte besitzt, wie die das Type aus VB6.
    Leider habe ich trotz identischer Variablen und auch Längen, zwei total verschiedene Gesamtgrößen.

    Visual Basic-Quellcode

    1. Private Type Datensammlung
    2. Nummer AS String * 20
    3. ZText As String * 1
    4. Zaehler As String * 8
    5. Wert As String * 1
    6. End Type
    7. Dim xyz As Datensammlung


    VB.NET-Quellcode

    1. Private Structure Datensammlung
    2. <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> Dim Nummer() AS Char
    3. <VBFixedString(1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=1)> Dim ZText() AS Char
    4. <VBFixedString(8), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=8)> Dim Zaehler() AS Char
    5. <VBFixedString(1), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=1)> Wert() AS Char
    6. End Structure
    7. Dim xyz As Datensammlung


    Die Funktionen haben sich nicht wirklich von Vb6 zu .NET geändert. (Projekt-Code)

    Also Beispiel unabhänig von dem oben beschriebenen Code habe ich in VB6 den Wert Len(..) = 101 und bei .NET Len(...) = 80.


    Hat jemand in diesem Bereich schonmal Erfahrungen machen können und kann mir vielleicht einen kleinen Gedankenanstoß geben?

    Mfg
    Bianco
    .wife {right: 100%; margin: 0;}
    @Bianco Ein String unter VB6 und ein Char-Array unter VB.NET sind was völlig verschiedenes.
    In VB6 ist ein Zeichen 1 Byte groß, in VB.NET ist ein Char 2 Byte groß.
    Dann ist die Speicherverwaltung absolut anders.
    Kein Wunder also, dass die Größe verschieden ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Aber müsste es dann nicht theoretisch in .NET größer sein?
    Gibt es denn eine andere Möglichkeit einem String eine vordefinierte "feste" Länge zuzuweisen?
    Die oben beschriebene habe ich durch eine Convert-Doku entdeckt.
    .wife {right: 100%; margin: 0;}

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bianco“ ()

    @EaranMaleasi
    Die Daten werden immer wieder an eine SPS-Steuerung übergeben, deswegen die feste Länge.
    Derzeit ist es so, dass Daten immer wieder gebündelt in eine bestimmt formatierte Datei geschrieben werden.
    Und zur Laufzeit gibt es dann Funktionen, die dann diese entweder direkt aus der Structure oder aus der Datei heraus in die SPS schreiben.
    .wife {right: 100%; margin: 0;}
    @Bianco Dann solltest Du eine Konvertierung nach Unmanaged vornehmen und das den Marshal machen lassen:
    Austausch von Daten zwischen einer VB.NET-exe und einer C-DLL, 32 und 64 Bit
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Danke für deine Antwort. Habe es nach deiner Anleitung versucht, jedoch nicht den gewüsnchten Effekt gehabt.
    Allerdings hab ich eine Lösung in eine msdn-Doku gefunden.

    VB.NET-Quellcode

    1. Private Structure Datensammlung
    2. <VBFixedString(20)> Dim Nummer As String
    3. <VBFixedString(1)> Dim ZText As String
    4. <VBFixedString(8)> Dim Zaehler As String
    5. <VBFixedString(1)> Dim Wert As String
    6. End Structure
    7. Dim xyz As Datensammlung


    Der Marshal hat mir dauerhaft die falschen Werte geliefert. Mit dieser Definition erhalte ich die genauen Ergebnisse, wie im VB6-Projekt! :thumbsup:
    .wife {right: 100%; margin: 0;}