alias in C# bekannt machen vorher war es ein typedef **gelöst**
-
Nein die Dll hat ca. 100 Funktionen davon einige Callbacks und insgesamt ein paar (ca. 10) eigen definierte typen als zusätzliche übergabeparameter.
Außerdem müßte mann dann änderungen immer an beiden Codestellen machen, was ich viel schlimmer finde.
Die Callbacks hab ich jetzt müssen nur noch die typen passend gemacht werden. Mein Problem ist ich weiß nicht so recht welche Typen es in CLI gibt und welche davon dann auch in C# verfügbar sind. Zum Test habe ich mal ein char definiert als übergabeparameter aber öffensichtlich scheint auch der c# char typ anders zu sein denn das ging auch nicht.
Aber in dem struckt ist alles mögliche drion was ich benötige, deshalb hab ich das mal angegeben.
MfG
-
Mein Problem ist ich weiß nicht so recht welche Typen es in CLI gibt und welche davon dann auch in C# verfügbar sind.
Du meinst wohl C++/CLI, den CLI ist die Common Language Infrastructure.
Aber zu Frage: Der Witz ist ja gerade, dank der dem CTS (Common Type System), dass in beiden Sprachen C# und C++/CLI (und alle anderen .NET Sprachen) dieselben Typen zur Verfügung stehen.Zum Test habe ich mal ein char definiert als übergabeparameter aber öffensichtlich scheint auch der c# char typ anders zu sein denn das ging auch nicht
Was Dir Kopfzerbrechen macht, vermute ich, wie die Typen zwischen C++/CLI (CTS, .NET) und dem ISO C++ gemappt sind.
Bsp. ein System.Char (.NET) ist 16bit Zahlenwert. Ausserdem ist in C# das Keyword char auf diesen Typen gemappt. Dasselbe auch in C++/CLI.
In ISO C++ jedoch ist char ein mindestens 8 bit grosser Zahlenwert.
Simon
-
wenn char in CLI/C++ und C# gleich wäre wieso geht das nicht:
in meiner Wrapper Klasse
public delegate void tKSRWdelHandler(char uwNumberOfDevices, void *pListOfDevices);
unsafe public void DllUSBDeviceChangeHandler(char uwNumberOfDevices, void *pListOfDevices) { } DllDotNet.CReadWrapper.OnHandler += new DllDotNet.tKSRWdelHandler(DllUSBDeviceChangeHandler);
er meldet:
Fehler CS0123: Keine Überladung für "DllUSBDeviceChangeHandler" stimmt mit dem Delegaten "ReaderDllDotNet.tKSRWdelDllUSBDeviceChangeHandler" überein.mache ich aus char int klappt es.
Aber mein eigentliches Problem ist das struct zur Zeit.
MfG
-
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; };