Shared Memory mit String in Struct
-
Hallo,
ich will ein (oder je ein) struct in C# mit einigen Daten zu lesen und zu schreiben.
EIn Prozes (SPS) hat definierte String Größen, somit weiß ich die Größe theoretisch.
Wie kann ich nun auf der C# Seite eine fixe Größe definieren (Referenzenieren ist ja nicht erlaubt bzw geht nicht, da ja keine fixe Größe ermittelbar ist).
-
Ich nehme an du willst auf der C bzw. C++ Seite
char
Arrays in der struct haben...? Korrekt?Dann gibt es mehrere Möglichkeiten. Wenn du
fixed
verwenden kannst ("allow unsafe code" und so), dann kannst dufixed
verwenden
Siehe z.B. http://stackoverflow.com/questions/19152441/create-fixed-size-string-in-a-struct-in-cOder du kannst das
MarshalAsAttribute
verwenden.
Beispielsweise (ungetestet)[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Ansi)] struct Foo { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string Fixed20; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public char[] Fixed20AsArray; }
Die
char
-Array Variante ist umständlicher, dafür etwas flexibler. z.B. kannst du bei der String-Variante keinen 20 Zeichen langen String verwenden, da immer ein Null-Terminator angehängt wird. Ebenso wirst du u.U. Probleme mit Strings haben die ein Nullbyte enthalten.
Und die Werte Pack sowie CharSet im StructLayoutAttribute musst du natürlich ggf. anpassen - weiss ja nicht was du brauchst.
(DieSizeConst
Werte musst du natürlich auch anpassen, aber das sollte hoffentlich klar sein.)
-
ich bekomm das mit dem unsafe nicht hin. irgendwo passen dann die Variablen bzw Übergeordneten STRUCT´s nicht zusammen:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace iViewExtension { public struct DataExchangeEmailIn { internal byte stateIn; // von PLC an C#/ Bit 0 = True neue Daten; internal Int32 port; internal char[] server; internal char[] absender; internal char[] empfaenger; internal char[] nachricht; internal char[] betreff; internal char[] user; internal char[] passwort; internal char[] iViewId; internal byte controlIn; } public struct DataExchangeEmailOut { internal byte controlOut; // von C# an PLC/ Bit 0 = True - neue Done; } public struct DataExchangeIn { internal DataExchangeEmailIn eMailIn; } public struct DataExchangeOut { internal DataExchangeEmailOut eMailOut; } public static class GVL { public static DataExchangeIn SmIn; public static DataExchangeOut SmOut; public static DataExchangeEmailIn eMailToIgm; } }
-
Aha.
Und nu? Das ist ein bisschen zu wenig Information als dass dir jemand helfen könnte. Wie sieht die C (ohne API von der SPS aus? Da gibt's doch sicher irgendwelche Headerfiles.
-
naja, mir steltl sich noch die Frage wie ich einen fixed char[33] in einen string umwandeln kann.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] unsafe public struct DataExchangeEmailIn { internal fixed char server[255]; }
-
Google: C# char array to string
Google: C# string to char array