Arraydefinition in managed c++



  • um es nochmal auf den Punkt zu bringen.

    Ich möchte wissen wie dieser Code C# in C++/CLI aussieht:

    [StructLayout(LayoutKind.Explicit, Size = 180, CharSet = CharSet.Ansi)] 
       public unsafe struct CELInfoMessage 
       { 
          [FieldOffset(0)] 
          public fixed byte szComputerName[32]; 
    
          [FieldOffset(32)] 
          public SYSTEMTIME time; 
    
          [FieldOffset(33)] 
          public byte cInfoSeverity; 
    
          [FieldOffset(34)] 
          public fixed byte szInfoText[128]; 
    
          [FieldOffset(162)] 
          public fixed byte szModuleName[16]; 
    
          [FieldOffset(178)] 
          public uint i4ProcId; 
       }
    


  • Fast genauso wie in C# ?

    [StructLayout(LayoutKind.Explicit, Size = 180, UnsafeValueType, CharSet = CharSet.Ansi)]
    public value struct CELInfoMessage
    {
    public:
      [FieldOffset(0)] unsigned char szComputerName[32];
    
       // usw.
    };
    

    Aber wenn die Klasse einen managed Wrapper darstellen soll, warum exportiert sie dann einen unsafe Typ ?



  • Hallo,

    also es kommt der Fehler:

    error C2065: 'UnsafeValueType': nichtdeklarierter Bezeichner

    ich möchte ja gar keinen unsafe typ exportieren ich hab gedacht wenn ich das mit fixed mache bekomme ich das auch managed hin. Aber da gibt es wohl kein fixes array?

    MfG



  • ich hab es jetzt mal etwas reduziert

    [StructLayout(LayoutKind::Explicit, "UnsafeValueType")] 
    	public value struct tKSRWTest
    	{
    		[FieldOffset(0)] unsigned char szComputername[32];
    	};
    

    jetzt erhalte ich folgende Fehler:

    error C2661: 'System::Runtime::InteropServices::StructLayoutAttribute::StructLayoutAttribute': Keine überladene Funktion akzeptiert 2 Argumente

    error C3270: tKSRWTest::szComputername': Das FieldOffset-Attribut kann nur im Kontext von 'StructLayout(LayoutKind::Explicit)' verwendet werden

    error C4368: "szComputername" kann nicht als Member von "tKSRWTest" (verwaltet) definiert werden: Gemischte Typen werden nicht unterstützt.



  • Ok, da ist wohl ein Fehler in meinem Buch. 🤡

    Neuer Versuch

    [System::Runtime::CompilerServices::UnsafeValueType]
    [StructLayout(LayoutKind.Explicit, Size = 180, CharSet = CharSet.Ansi)]
    public value struct CELInfoMessage
    {
    

    Und zu deiner anderen Frage: Wenn du keine .net Arrays haben willst, musst du eben mit unsafe leben. Das stellt für mich allerdings den Sinn des Wrappers in Frage, da kannst du auch gleich in C# die C-Schnittstelle aufrufen, das dürfte effizienter sein.

    Ansonsten einen normalen .net Datentyp (struct oder Klasse) erstellen und im C++/CLI Wrapper umkopieren. Kommt halt darauf an, ob du Effizienz oder .net konformen Code haben willst.



  • ich möchte .Net Arrays weil ich will ja meinen Wrapper korrekt bauen.

    Nur die Frage ist das wie gehen die .NET Arrays mit den Unions zusammen?

    MfG



  • Du hast glaube ich den Sinn und Zweck von C++/CLI nicht verstanden!!!

    Lass diese bescheuerte Deklarationen weg und baue einen *Wrapper*! Und verwende intern einfach normales C!



  • mach ich ja

    nur soll mein wrapper für C# unions bieten aber das geht wieder nicht mit den managed arrays.

    MfG



  • Normale unions gibt es halt in .net nicht.

    Der Trick mit dem LayoutKind.Explicit geht nur für elementare Typen ohne unsafe.

    Dein Wrapper könnte allerdings auch eine Klasse sein, die intern den C-Datentyp mit einem Byte-Array abbildet. Den Zugriff auf die union Member realisierst du mit Properties, die die entsprechenden Arraybereiche als .net Arrays nach außen durchreichen, inkl. Längenprüfung beim Schreiben.



  • wie sieht das mit den proberties genau aus

    ein beispiel wäre nicht schlecht

    MfG


Anmelden zum Antworten