hallo; ich habe einen dll in c++, welche ich in c# mit [DllImport(... einbinde. funktioniert soweit sehr gut. manche funktionen brauchen aber bestimmte strukturen und ich weiß nicht wie ich dann auf diese strukturen korrekt zugreifen kann.
typedef union tagTS{
unsigned char State;
struct tagTSBits{
unsigned char fb:1;
unsigned char fs:1;
unsigned char ft:1;
}bits;
}TS;
und noch schlimmer
typedef union tagRS{
byte analog;
TS tsValue;
char analogText[9];
}
ich habe mal
[StructLayout(LayoutKind.Sequential)]
struct TS
{
public byte fb;
public byte fs;
public byte ft;
}
bzw. einfach mal ein byte mitgegeben; aber beide ergebnisse sind nicht das was ich mir erwarte.
und bei "char analogText[9];" bin ich mir überhaupt unsicher wie ich das mit dem speicher hinkriege.
danke für eure hilfe. werner
Hi!
Wieso verwendest du eine union? Den einzigen Sinn den die Dinger haben ist Speicherplatz einzusparen und zur Optimierung sind sie auch geeignet. Man sollte sie allerdings vermeiden.
Das du unions in C# nicht verwenden kannst könnte damit zusammenhängen das C# diese nicht unterstützt. Ansonsten greifst du auf eine Struktur genau wie in C++ zu. Du deklarierst eine Variable von dem Typen deiner Struktur und greifst per .-Operator auf die einzelnen Variablen zu.
Zu diesem "char analogText[9];" so ist es in einer union ja so, das die union so viel Speicher reserviert wie die größte von ihr verwaltete Variable an speicher benötigt. Du kannst also sämtliche Datentypen in einer union benutzen. Also ich sehe da kein Problem bei der Benutzung von "char analogText[9];" bzw. sehe ich keine Probleme mit dem Speicher. Es sieht nämlich nicht so aus als wenn diese Variable am größen wäre und selbst wenn wäre dies auch kein Problem.
Code-Hacker
LayoutKind.Explizit heisst es. Die Position der einzelnen Felder gibt man mit FieldOffset an.
Beispiel:
[StructLayout(LayoutKind.Explicit)]
public struct UnionStruct {
[FieldOffset(0)] public short Short;
[FieldOffset(0)] public byte Byte0;
[FieldOffset(1)] public byte Byte1;
}
Edit:
Array-Elemente direkt in eine Struktur einbetten geht so.
public struct ArrayStruct {
[MarshalAs(UnmanagedType.ByValArray, SizeConst=9)]
public char[] charArray;
}