Call method mit Pointer

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Call method mit Pointer

    Hey,

    Ich experimentiere immer gerne mit neuen Sachen oder mit denen ich mich nicht auskenne ^^
    Daher folgende Frage.

    Ist es möglich eine Methode oder eine MemberReference z.B. Console.WriteLine() per Pointer aufzurufen, - in C#?
    Mir ist nur "calli" bekannt, - das ist eine Möglichkeit, - gibt es evtl noch weitere wo man nur durch Pointer-Arithmetik methoden aufrufen kann? ^^
    C# Developer
    Learning C++

    Rikudo schrieb:

    Pointer-Arithmeti
    nicht direkt, aber über Delegates.
    Du erstellst einen sozusagen-Pointer, dem Du nach Belieben eine Prozedur zuweist und aufrufst.
    Gugst Du z.B. hier
    oder 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!
    Hallo Rikudo

    So auf die schnelle fällt mir nur gerade das hier ein, um die Adresse einer Funktion in einem Pointer zu Speichern. Der Weg über ein Delegate + invoke ist aber unvermeidlich.

    Freundliche Grüsse

    exc-jdbi


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System
    4. Imports System.Runtime.InteropServices
    5. Module Module1
    6. Public Delegate Sub delfunc(ByVal s As String)
    7. Private Sub printOut(ByVal msg As String)
    8. Console.WriteLine(msg)
    9. End Sub
    10. Private Sub printOut(ByRef p As IntPtr, ByVal msg As String)
    11. Dim del As [Delegate] = Marshal.GetDelegateForFunctionPointer(p, GetType(delfunc))
    12. del.DynamicInvoke(msg)
    13. End Sub
    14. Private Function getPrintPointer() As IntPtr
    15. Dim po As New delfunc(AddressOf printOut)
    16. Return Marshal.GetFunctionPointerForDelegate(po)
    17. End Function
    18. Public Sub Main()
    19. Dim ptr As IntPtr = getPrintPointer()
    20. Dim msg As String = "your Message"
    21. printOut(ptr, msg)
    22. Stop
    23. End Sub
    24. End Module


    Spoiler anzeigen

    C#-Quellcode

    1. class Program
    2. {
    3. public delegate void delfunc(string s);
    4. private static void printOut(string msg)
    5. {
    6. Console.WriteLine(msg);
    7. }
    8. private static void printOut(ref IntPtr p, string msg)
    9. {
    10. Delegate del = Marshal.GetDelegateForFunctionPointer(p, typeof(delfunc));
    11. del.DynamicInvoke(msg);
    12. }
    13. private static IntPtr getPrintPointer()
    14. {
    15. delfunc po = new delfunc(printOut);
    16. return Marshal.GetFunctionPointerForDelegate(po);
    17. }
    18. static void Main(string[] args)
    19. {
    20. IntPtr ptr = getPrintPointer();
    21. string msg = "your Message";
    22. printOut(ref ptr, msg);
    23. Console.ReadLine();
    24. }
    25. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()