Wrapping von C++ dll's in C# - Zusatz attribute (Ja/Nein)?

  • C#
  • .NET (FX) 4.5–4.8

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

    Wrapping von C++ dll's in C# - Zusatz attribute (Ja/Nein)?

    Hallo :D

    Zur zeit bin ich dran verschiedene lib's in C# zu übertragen und wie man so halt ist,
    schaut man auch mal ins internet und dabei bin ich mal wieder über diverse Parameter-Attribute gestolpert
    (e.g.:
    ​[In] [MarshalAs(UnmanagedType.LPArray)],
    ​[Out] [MarshalAs(UnmanagedType.I4)],
    ​[MarshalAs(UnmanagedType.U8)],
    ​[In] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysUInt, SizeParamIndex = 1)])

    ist es wirklich notwendig diese Attribute beizufügen oder kann man die weglassen ?

    wenn ich mir Speziell [MarshalAs(UnmanagedType.LPArray)] vornehme, dann könnte ich in einem unsafe konstrukt
    doch void* bzw einen unmanaged type pointer nutzen. (vernachlässigung das ich über einen anderen parameter die Länge angeben/bekomme)

    zudem ich so oder so die Nativen aufrufe proxy (bzw. sollte man das so machen).
    @Facebamm Diewse Attribute sorgen für die richtige Konvertierung der Parameter.
    So kannst Du z.B. statt eines IntPtrs direkt einen String reinschreiben, wenn das Attribut stimmt.
    Was da hin muss, ist nicht immer klar, insbesondere bei Strings, Arrays, Strukturen und Pointern allgemein.
    Manchmal muss man da auch ein wenig experimentieren.
    Gugst Du Austausch von Daten zwischen einer VB.NET-exe und einer C-DLL, 32 und 64 Bit
    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!
    Okay.

    Bis jetzt hat immer alles gut geklappt ohne angabe der Attribute.

    nehmen wir den Fall an, ich mach alles über (unmanaged type) Ptr., dann wären solche angaben hinfällig.
    (Natürlich muss aus der Doc. hervorgehen was es genau ist. (e.g: Ptr. to array of ... ))


    Den beitrag kenn ich schon, trz. Danke :D

    Facebamm schrieb:

    was es genau ist
    Das ist der Witz dabei.
    z.B. string statt IntPtr:

    C#-Quellcode

    1. [DllImport(DllName, SetLastError = true, CharSet = CharSet.Auto)]
    2. [return: MarshalAs(UnmanagedType.LPStr)]
    3. internal static extern string GetDeviceName(uint index);

    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!

    Facebamm schrieb:

    dann wäre sowas aber unnötig ?
    Ja.
    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!