Übergabe von Zeigern von nicht verwaltetem code
Ich habe ein C# - Projekt, dass die Einfuhren eine C-dll, die dll hat diese Funktion:
int primary_read_serial(int handle, int *return_code, int *serial, int length);
Möchte ich, um Zugriff auf die seriellen parameter. Ich habe nämlich, bis Sie wieder ein Zeichen von der seriellen parameter, aber ich bin mir nicht wirklich sicher, was ich mache, und würde gerne verstehen, was Los ist, und natürlich es funktioniert.
So, ich bin mir sehr sicher, dass die dll zugegriffen wird, andere Funktionen ohne Zeiger funktionieren. Wie gehe ich mit Zeigern? Muss ich Marschall es? Vielleicht habe ich einen festen Platz für die Daten?
Eine Erklärung wäre toll.
Dank!
Richard
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden kann, müssen Sie einen IntPtr und Marschall, IntPtr, was C# - Struktur, die Sie wollen. In Ihrem Fall haben Sie nach Marschall es ein int[].
Diese erfolgt in mehreren Schritten:
Code sollte Ihnen eine Idee:
Vergessen Sie nicht, den try-finally, oder Sie riskieren undichte die nicht verwaltete Griff.
Wenn ich verstehe, was Sie versuchen zu tun, dies sollte für Sie arbeiten.
JaredPar gibt Ihnen die einfache Möglichkeit, es zu tun, aber, das ist nur zu ändern Sie Ihre externe Funktion-Deklaration, so dass in C# wird das marshalling für Sie im hintergrund.
Ich hoffe, dies gibt Ihnen eine Vorstellung von dem, was passiert auf einem etwas niedrigeren Niveau sowieso.
Beim schreiben von P/invoke Deklaration der Funktion, verwenden Sie keyword-ref für die Zeiger-Parametern:
Ich bin mir nicht sicher, ob müssen Sie den Parameter' Namen in C#. Und denken Sie daran, beim aufrufen der Methode, die Sie auch verwenden, ref in den Argumenten, die Sie ' re passing by reference.