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 - int

    in 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





  • 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...


Anmelden zum Antworten