alias in C# bekannt machen vorher war es ein typedef **gelöst**
-
jetzt hab ich es
dem c# char entspricht der ClI/C++ Char (groß geschrieben) der normale char (klein geschrieben) existiert ind CLI/C++ noch aber nicht mehr in C#
also hab ich den Char groß geschrieben und es ging.
Oder ich schreibe in CLI/C++ char (klein) und in C# sbyte.
Also jetzt noch mal die Frage nach dem Problem bei dem struct. Wieso kann ich nicht auf die member zugreifen?
MfG
-
Bsp. ein System.Char (.NET) ist 16bit Zahlenwert. Ausserdem ist in C# das Keyword char auf diesen Typen gemappt. Dasselbe auch in C++/CLI.
Da ist mir noch ein Fehler unterlaufen:
In C# ist das Keyword char auf System.Char gemappt (16 bit, unsigned).
In C++/CLI ist das Keyword char auf System::SByte gemappt (8 bit, signed)Simon
Edit: *g* fast gleichzeitig...
-
c++ type - C# type
unsigned char - byte
char - sbyte
unsigned short - ushort
short - short
unsigned long - uint
long - intin c# gemappt?
mein struct sieht jetzt so aus:
public struct tKSRWComConfigData { tKSRWDllComType m_ComType; union { struct { unsigned char m_ubPort; //COM port unsigned long m_uwBaudrate; //baud rate tKSRWDllParityMode m_DllParityMode; unsigned char m_bAreTwoStopBits; } m_RS232; struct { unsigned long m_udwDeviceNumber; } m_USB; struct { unsigned char m_bIPAddressType; //0 = IPv4 or 1 = IPv6 unsigned char m_bIsIPAddress; union { unsigned char m_rgubIPAddress[16]; //IPaddress unsigned char m_rgubNetworkName[16]; } m_KindOfConnection; } m_Ethernet; } m_ComConfigParameters; };
aber ich kann in C# immer noch nicht auf die member zugreifen (Fehler CS1061: "DllDotNet.tKSRWComConfigData" enthält keine Definition für "m_ComType", und es konnte keine Erweiterungsmethode "m_ComType" gefunden werden, die ein erstes Argument vom Typ "DllDotNet.tKSRWComConfigData" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
)DllDotNet.tKSRWComConfigData ComConfig = new DllDotNet.tKSRWComConfigData(); ComConfig.m_ComType = KSRW_DLLCT_RS232;
woran könnte dies liegen?
MfG
-
ich vereinfache nochmal
public struct tKSRWComConfigData { unsigned char test; //tKSRWDllComType m_ComType; };
DllDotNet.tKSRWComConfigData ComConfig = new DllDotNet.tKSRWComConfigData(); ComConfig.test = 5;
ergibt den selben Fehler.
MfG
-
Dein struct ist einfach kein .NET. Es ist kein C++/CLI.
(Ehrlich gesagt, wundert es mich, dass es in C# sichtbar / instanzierbar ist.)Ein .NET kompatibles struct wäre so:
namespace A { public value struct B { char c; } }
-
also value ist der alias für typedef?
-
jetzt kennt er das enum nicht
public enum tKSRWDllComType { KSRW_DLLCT_RS232 = 0, //RS232 connection KSRW_DLLCT_USB, //USB connection KSRW_DLLCT_ETHERNET //Ethernet connection };
ComConfig.m_ComType = KSRW_DLLCT_RS232;
Fehler CS0103: Der Name "KSRW_DLLCT_RS232" ist im aktuellen Kontext nicht vorhanden.
MfG
-
Ok
das verursacht den selben Fehler:
DllDotNet.tKSRWDllComType test = new DllDotNet.tKSRWDllComType(); test = KSRW_DLLCT_USB;
wie mache ich das enum bekannt?
-
Destiniy schrieb:
also value ist der alias für typedef?
Nein.
In ISO C++ gibts das Keyword struct. In C++/CLI gibts das Keyword value struct.
Lies mal das: http://www.codeproject.com/KB/books/CppCliInActionCh1Ex1.aspx
-
die Seite ist ganz gut.
Nur leider sagt sie auch nichts warum ich das enum nicht zuweisen kann.
public enum tKSRWDllComType { KSRW_DLLCT_RS232 = 0, //RS232 connection KSRW_DLLCT_USB, //USB connection KSRW_DLLCT_ETHERNET //Ethernet connection };
DllDotNet.tKSRWDllComType test = new DllDotNet.tKSRWDllComType(); test = KSRW_DLLCT_USB;
kannst du mir nochmal nen tip geben?
MfG
-
so wenn ich aus dem enum ein enum struct mache
public enum struct tKSRWDllComType { KSRW_DLLCT_RS232 = 0, //RS232 connection KSRW_DLLCT_USB, //USB connection KSRW_DLLCT_ETHERNET //Ethernet connection };
dann kann ich es in C# setzen.
DllDotNet.tKSRWDllComType test = new DllDotNet.tKSRWDllComType(); test = DllDotNet.tKSRWDllComType.KSRW_DLLCT_USB;
Jetz frage ich mich was ist da der unterschied? Kann mir den einer erklären?
MfG
-
Oh wunder....
-
OK also gibt es in CLI/C++ alles in managed und unmanaged und wenn es in C# benutzt werden soll muß es immer managed sein.
eine Frage habe ich aber noch:
was ist der unterschied zwischen
public value struct tKSRWComConfigData { tKSRWDllComType m_ComType; public value struct m_RS232 { unsigned char m_ubPort; //COM port unsigned long m_uwBaudrate; //baud rate tKSRWDllParityMode m_DllParityMode; unsigned char m_bAreTwoStopBits; } ; };
geht nicht (error C3379: 'DllDotNet::tKSRWComConfigData::m_RS232': Eine geschachtelte Klasse kann keinen Assembler-Zugriffsspezifizierer als Teil seiner Deklaration haben)
und
public value struct tRS232 { unsigned char m_ubPort; //COM port unsigned long m_uwBaudrate; //baud rate tKSRWDllParityMode m_DllParityMode; unsigned char m_bAreTwoStopBits; }; public value struct tKSRWComConfigData { tKSRWDllComType m_ComType; tRS232 m_RS232; }
das Funktioniert
-
OK also gibt es in CLI/C++ alles in managed und unmanaged und wenn es in C# benutzt werden soll muß es immer managed sein.
Nein. C++/CLI ist NUR managed. C# auch.
Bei C++/CLI gibts einfach eine sehr gute und einfache Interoperabilität zu ISO C++ (unmanaged).
-
gibt es unions als managed?
-
also geht sowas:
public union tKindofConnection { unsigned char m_rgubIPAddress[16]; //IPaddress unsigned char m_rgubNetworkName[16]; }; public value struct tEthernet { unsigned char m_bIPAddressType; //0 = IPv4 or 1 = IPv6 unsigned char m_bIsIPAddress; tKindofConnection m_KindOfConnection; };
-
jetzt noch eine Frage:
Wie kann ich die Länge des Arrays angeben, sodass der c# nutzer der Klasse nur ein Array von 16 Bytes machen kann jetzt bei Networkname?
public value struct tRS232 { unsigned char m_ubPort; //COM port unsigned long m_uwBaudrate; //baud rate tKSRWDllParityMode m_DllParityMode; unsigned char m_bAreTwoStopBits; }; public value struct tUSB { unsigned long m_udwDeviceNumber; }; public value struct tEthernet { unsigned char m_bIPAddressType; //0 = IPv4 or 1 = IPv6 unsigned char m_bIsIPAddress; array<unsigned char> ^m_rgubIPAddress; //IPaddress array<unsigned char> ^m_rgubNetworkName; }; public value struct tKSRWComConfigData { tKSRWDllComType m_ComType; tRS232 m_RS232; tUSB m_USB; tEthernet m_Ethernet; };
-
Wie kann ich die Länge des Arrays angeben, sodass der c# nutzer der Klasse nur ein Array von 16 Bytes machen kann jetzt bei Networkname?
Das kannst Du nicht ohne selbst Code zu schreiben, denn in C# kann die Grösse von Arrays nicht zur Compiletime angegeben werden (im Gegensatz zu C++). Mach ein Wrapper (ev. mit Hilfe von Generics) oder prüfe das Array beim benutzen.
-
wie prüfe ich die länge beim beutzen. Angenommen ich bekomme das Array aus C# raus übergeben und will dann sicherstellen das es 16 bytes lang ist?
und habe ich da recht das es unions managed nicht gibt?
-
Siehe mein letzer Beitrag zum Thema mit den WinAPI Callbacks...