.NET-Interop IntPtr vs. ref

Wahrscheinlich eine noob Frage, aber interop ist einer meiner starken Punkte noch.

Abgesehen von der Beschränkung der Anzahl der überladungen ist es aus irgendeinem Grund sollte ich erklären, meine DllImports wie:

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

Und verwenden Sie wie folgt:

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:

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

Und es zu benutzen, wie:

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

Den von ref überlast endet als einfacher zu bedienen, aber ich Frage mich, ob es ein Nachteil ist, ich bin mir nicht bewusst.

Edit:

Viele tolle info, so weit Jungs.

@P Papi: haben Sie ein Beispiel davon, die struct-Klasse aus einer abstrakten (oder einer anderen) Klasse? Ich änderte meine Signatur:

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

Ohne die In, Out, und MarshalAs SendMessage (EM_GETCHARFORMAT in meinem test) fehl. Das obige Beispiel funktioniert gut, aber wenn ich es zu ändern:

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

Bekomme ich eine System.TypeLoadException, dass das CHARFORMAT2 format nicht gültig ist (ich werde versuchen, es einzufangen für hier).

Ausnahme:

Konnte nicht geladen werden Typ 'CC.Utilities.WindowsApi.CHARFORMAT2' aus assembly 'CC.Utilities, Version=1.0.9.1212, Culture=neutral, PublicKeyToken=111aac7a42f7965e", denn das format ist ungültig.

Den NativeStruct Klasse:

public class NativeStruct
{
}

Ich habe versucht abstract hinzufügen der StructLayout Attribut, etc. und bekomme ich die gleiche exception.

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

Edit:

Ich nicht zu Folgen, die FAQ und ich stellte eine Frage, die diskutiert werden kann, aber nicht positiv beantwortet. Abgesehen davon, dass es hat viele aufschlussreiche Informationen in diesem thread. Also ich überlasse es den Lesern zu Stimmen, eine Antwort. Erste, über 10 bis-Stimmen wird die Antwort sein. Wenn keine Antwort trifft dies in zwei Tagen (12/17 PST), werde ich meine eigene Antwort, dass fasst alle lecker Kenntnisse im thread 🙂

Bearbeiten Wieder:

Ich habe gelogen, die Annahme P Daddy ' s Antwort, weil er der Mann ist und war eine große Hilfe (er hat einen niedlichen kleinen Affen zu :-P)

  • Die NativeStruct-Klasse muss die StructLayout Attribut zu. Ich werde nach meiner Arbeit Beispielcode.
Schreibe einen Kommentar