.NET Interop IntPtr vs.

Wahrscheinlich eine Noob-Frage, aber Interop ist noch keine meiner Stärken.

Abgesehen von der Begrenzung der Anzahl der Überladungen sollte ich meine DllImports aus irgendeinem Grund wie folgt deklarieren:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);

Und benutze sie so:

IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(formatrange));
Marshal.StructureToPtr(formatrange, lParam, false);

int returnValue = User32.SendMessage(_RichTextBox.Handle, ApiConstants.EM_FORMATRANGE, wParam, lParam);

Marshal.FreeCoTaskMem(lParam);

Anstatt eine gezielte Überlastung zu erzeugen:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref FORMATRANGE lParam);

Und benutze es wie:

FORMATRANGE lParam = new FORMATRANGE();
int returnValue = User32.SendMessage(_RichTextBox.Handle, ApiConstants.EM_FORMATRANGE, wParam, ref lParam);

Die Überlastung durch Verweis ist am Ende einfacher zu handhaben, aber ich frage mich, ob es einen Nachteil gibt, den ich nicht kenne.

Bearbeiten:

Bis jetzt viele tolle Infos, Leute.

@P Daddy: Hast du ein Beispiel dafür, wie man die struct Klasse von einer abstrakten (oder einer beliebigen) Klasse ableitet? Ich habe meine Unterschrift geändert in:

[DllImport("user32.dll", SetLastError = true)]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, [In, Out, MarshalAs(UnmanagedType.LPStruct)] CHARFORMAT2 lParam);

Ohne dasIn, Out, undMarshalAs Die SendMessage (EM_GETCHARFORMAT in meinem Test) schlägt fehl. Das obige Beispiel funktioniert gut, aber wenn ich es ändere:

[DllImport("user32.dll", SetLastError = true)]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, [In, Out, MarshalAs(UnmanagedType.LPStruct)] NativeStruct lParam);

Ich erhalte eine System.TypeLoadException, die besagt, dass das CHARFORMAT2-Format ungültig ist (ich werde versuchen, es hier zu erfassen).

Die Ausnahme:

Typ 'CC.Utilities.WindowsApi.CHARFORMAT2' aus Assembly 'CC.Utilities, Version = 1.0.9.1212, Culture = neutral, PublicKeyToken = 111aac7a42f7965e' konnte nicht geladen werden, da das Format ungültig ist.

Die NativeStruct-Klasse:

public class NativeStruct
{
}

ich habe es versuchtabstractHinzufügen derStructLayout Attribut usw. und ich bekomme die gleiche Ausnahme.

[StructLayout(LayoutKind.Sequential)]
public class CHARFORMAT2: NativeStruct
{
    ...
}

Bearbeiten:

Ich habe die FAQ nicht befolgt und eine Frage gestellt, die diskutiert, aber nicht positiv beantwortet werden kann. Abgesehen davon gab es in diesem Thread viele aufschlussreiche Informationen. Also überlasse ich es den Lesern, eine Antwort abzustimmen. Das erste bis über 10-fache der abgegebenen Stimmen ist die Antwort. Wenn in zwei Tagen keine Antwort auf diese Frage zutrifft (17.12. PST), füge ich meine eigene Antwort hinzu, die all das leckere Wissen im Thread zusammenfasst :-)

Erneut bearbeiten:

Ich habe gelogen und P Daddys Antwort akzeptiert, weil er der Mann ist und eine große Hilfe war (er hat auch einen süßen kleinen Affen :-P)

Antworten auf die Frage(5)

Ihre Antwort auf die Frage