alias in C# bekannt machen vorher war es ein typedef **gelöst**



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



  • klar kann ich mir eine Kalsse bauen die das Array enthält und die Länge ebenfalls aber ich dachte, da du geschrieben hast

    oder prüfe das Array beim benutzen

    es gibt da eine möglichkeit das array direkt zu prüfen.

    MfG



  • theta schrieb:

    Siehe mein letzer Beitrag zum Thema mit den WinAPI Callbacks...

    Oh, ich meinte am Anfang dieses Threads:

    Hier die Codestelle:

    array<Byte>^ data;
    
    if (data == nullptr) 
    { 
        throw gcnew ArgumentNullException(); 
    }
    
    // Hier wird geprüft, ob das Array genau die Länge 12 hat !
    if (data->Length != 12) 
    { 
        throw gcnew ArgumentException(); 
    }
    


  • ich habe jetzt dieses c++ struct

    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; 
        };
    

    in dieses struct gewandelt die unsions habe ich weggelassen (d.h. es braucht mehr speicherplatz und ein einfaches memcopy beim zuweisen geht dadurch nicht mehr)

    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; 
        };
    

    Danke nochmal für die Hilfe

    MfG


Anmelden zum Antworten