Marshalling Long/System.Int32

  • C#
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Marshalling Long/System.Int32

    Hallo,

    ich weiß nicht ob ich es falsch verstanden habe oder ob es grundlegende Änderungen zu beachten gibt..

    ​Der System-Namespace verfügt über mehrere Werttypen, die das mittels Boxing gepackte Format primitiver Laufzeittypen darstellen. So repräsentiert der Werttyp der System.Int32-Struktur beispielsweise das mittels Boxing gepackte Format von ELEMENT_TYPE_I4 . Diese Typen werden nicht wie andere formatierte Typen als Strukturen gemarshallt, sondern das Marshalling erfolgt auf dieselbe Weise, wie das Marshalling für die von ihnen mittels Boxing gepackten primitiven Typen. System.Int32 wird demzufolge nicht als Struktur mit einem einzigen Member des Typs long, sondern als ELEMENT_TYPE_I4 gemarshallt.


    System.Int32 ist aber ja 32bit und long als Datentyp hat ja 64bit fällt da jetzt was weg oder spielt hierbei die Größe keine Rolle und long wird einfach dazu rein gepackt?

    Ich würde nur gern wissen was mit nem Datentyp long passiert bzw was ich damit anstellen muss

    hier die Seite

    Runshak schrieb:

    bzw was ich damit anstellen muss
    In welchem Kontext?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich hab ne c++ dll und soll aus meinem C# Projekt eine/mehrere Funktionen in dieser Dll aufrufen

    [edit] ich hab ne Startmethode...

    C#-Quellcode

    1. private static extern long S_Start(char* _DB_Path, char* _GLOB_GUID, char* _RG_PATH, long _EE_ID, long _EE_Par, long new_Ring, long _auto_Start, long* Status_Flag);


    hierbei sind diese Werte anzunehmen

    C#-Quellcode

    1. long _EE_ID = 1;
    2. long _EE_Par = 0;
    3. long new_Ring = 1;
    4. long _auto_Start = 0;


    der Rest davon spielt keine große Rolle

    leider komme ich hier jetzt nicht weiter und habe deswegen schon einiges probiert/versucht...allerdings fehlt mir eine richtige Vorgehensweise... da ich nicht genau weiß wie ich jetzt die Funktion auch starten könnte

    Runshak schrieb:

    in dieser Dll aufrufen
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    C#-Quellcode

    1. [DllImport("dllName", CharSet = ...]
    2. private static extern long S_Start([MarshalAs(UnmanagedType.LPStr)] string _DB_Path,
    3. [MarshalAs(UnmanagedType.LPStr)] string _GLOB_GUID,
    4. [MarshalAs(UnmanagedType.LPStr)] string _RG_PATH,
    5. [MarshalAs(UnmanagedType.I8)] long _EE_ID,
    6. [MarshalAs(UnmanagedType.I8)] long _EE_Par,
    7. [MarshalAs(UnmanagedType.I8)] long new_Ring,
    8. [MarshalAs(UnmanagedType.I8)] long _auto_Start,
    9. IntPtr Status_Flag);


    Was soll Status_Flag sein? Weshalb ist das ein Pointer? Kommt da was zurück? Je nachdem kann man auch "out" oder "ref" verwenden und dafür IntPtr durch long ersetzen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.