Ich habeWie bekomme ich IntPtr zu einer Struktur?
public int Copy(Texture texture, Rect? srcrect, Rect? dstrect)
Rect
ist eine Methode mit der Signatur bekam eine Struktur, aber ich brauche auch der Anrufer weitergeben null
(oder IntPtr.Zero
) mit dem Verfahren zu ermöglichen.
Ich möchte dann mit der Unterschrift auf eine DLL abgehen
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_RenderCopy")]
internal static extern int RenderCopy(IntPtr renderer, IntPtr texture, IntPtr srcrect, IntPtr dstrect);
Ich hatte gehofft, ich etwas wie das folgende tun könnte:
return SDL.RenderCopy(_ptr, texture._ptr, srcrect.HasValue ? (IntPtr)srcrect.Value : IntPtr.Zero, dstrect.HasValue ? (IntPtr)dstrect.Value : IntPtr.Zero);
Aber ich kann die Struktur nicht gegossen so wie das. Gibt es eine andere Möglichkeit, wie ich eine IntPtr
daraus bekommen kann?
Es Alternative 4 Überlastungen zu schaffen:
ref Rect, ref Rect
IntPtr, IntPtr
ref Rect, IntPtr
IntPtr, ref Rect
die bekommen könnte noch unordentlicher, wenn ich jemals mehr als 2 struct Zeiger übergeben muss.
kam ich mit einer Lösung, aber ich habe einige Fragen zu diesem Thema:
public int Copy(Texture texture, Rect? srcrect=null, Rect? dstrect=null)
{
return SDL.RenderCopy(_ptr, texture._ptr, srcrect.HasValue ? StructToPtr(srcrect) : IntPtr.Zero, dstrect.HasValue ? StructToPtr(dstrect) : IntPtr.Zero);
}
private static IntPtr StructToPtr(object obj)
{
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj));
Marshal.StructureToPtr(obj, ptr, false);
return ptr;
}
Hätte ich ref Rect
verwendet würde ich nicht gehabt haben Speicher für die Struktur zuzuordnen - was bedeutet, dass anders machen als das tut?
Ich habe etwas experimentiert. Die ref Rect
Lösung läuft ungefähr in der gleichen Geschwindigkeit wie Umwandlung Generierung einer Rect
in IntPtr
IntPtr
für eine Rect
, die mich vermuten lässt, dass C# etwas sehr ähnliches unter der Haube tut, wenn Sie Refs verwenden. Sobald ich es zu einer Rect?
mache und die bedingte Logik der Methode hinzufüge, läuft es bis zu 50% langsamer ... also wäre die Route mit 4 Überladungen wahrscheinlich die schnellste. Wir sprechen jedoch 100-150ms für 100K-Iterationen, was bedeutet, dass die Methode selbst sehr billig ist, weshalb die Konditionalitäten wahrscheinlich einen so bemerkenswerten Einfluss haben. Daher bleibe ich bei meiner benutzerdefinierten StructToPtr
Lösung, da es die einfachste Lösung ist.
Ihr Titel ist schlecht formuliert. Sie können eine Struktur nicht in IntPtr konvertieren. Sie können jedoch einen Zeiger auf eine Struktur erhalten. –
@ JimMischel: True. Ich habe nicht darüber nachgedacht, es tatsächlich "umzuwandeln", ich dachte an etwas in der Art einer Besetzung; in C können Sie ein '&' vor eine Variable schlagen, um ihre Adresse zu erhalten. – mpen