Arraydefinition in managed c++



  • Hallo,

    hat keiner eine Idee wie obiger Code in CLI aussieht?

    MfG



  • struct CELInfoMessage 
    {
        byte szComputerName[32];
        // ..
    }; // <- ??
    


  • also byte kennt der schon mal nicht

    wenn ich das mache

    public value struct tTest
    {
    	unsigned char szComputername[32];
    };
    

    meint er:

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

    MfG



  • Welche native Funktion möchtest Du aufrufen?
    Ev. gibts schon eine passende managed Funktion...

    Simon



  • Ich schreibe eine Wrapper DLL die eine normale c DLL in C# verfügbar macht.

    Jetzt gibt es in dem Header der C Dll struckturen die Unions enthalten. Jetzt möchte ich das meine C++ .Net Dll auch Unions hat. Das Geht ja mit StructLayout(LayoutKind.Explicit und FieldOffset.

    Da bekomme ich aber bei Array Probleme. Da ich ja immer nur einen zeiger in mein Struckt machen kann (z.B.:

    array<unsigned char> ^m_rgubNetworkName;
    

    ).

    Jetzt habe ich das obige besipiel mit den fixed arrays für C# gefunden. Das heißt fixed arrays sind in .NET möglich. Jetzt ist für mich nur noch die Frage wie diese in .NET C++ aussehen das sie managed sind.

    MfG



  • Warum verwendest Du in C kein C?????

    Lass das ganze .NET Zeugs einfach weg und verwende die include-Datei Deiner normalen DLL.
    Das ist ja gerade der Vorteil von C++/CLI, dass man die native Dinge direkt verwenden kann! Sonnst kannst Du ee ja gleich in C# machen; dann gibt es für C++/CLI keinen Grund!



  • das Ziel meiner Wrapper Dll ist die C Funktionen für C# verfügbar zu machen mit Hilfe einer C++/CLI dll die nach außen nur managed typen und funktionen hat.



  • 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