.NET Interop IntPtr vs. ref

Probablemente sea una pregunta noob, pero la interoperabilidad no es uno de mis puntos fuertes todavía.

Aparte de limitar el número de sobrecargas, ¿hay alguna razón por la que deba declarar mis DllImports como:

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

Y úsalos así:

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);

En lugar de crear una sobrecarga dirigida:

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

Y usándolo como:

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

La sobrecarga por referencia termina siendo más fácil de usar, pero me pregunto si hay un inconveniente que no conozco.

Editar:

Un montón de buena información hasta ahora chicos.

@P Daddy: ¿Tiene un ejemplo de cómo basar la clase de estructura en una clase abstracta (o en cualquiera)? Cambié mi firma a:

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

Sin elIn, OutyMarshalAs el SendMessage (EM_GETCHARFORMAT en mi prueba) falla. El ejemplo anterior funciona bien, pero si lo cambio a:

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

Obtengo una excepción System.TypeLoadException que dice que el formato CHARFORMAT2 no es válido (intentaré capturarlo aquí).

La excepción:

No se pudo cargar el tipo 'CC.Utilities.WindowsApi.CHARFORMAT2' del ensamblado 'CC.Utilities, versión = 1.0.9.1212, Culture = neutral, PublicKeyToken = 111aac7a42f7965e' porque el formato no es válido.

La clase NativeStruct:

public class NativeStruct
{
}

He intentadoabstract, añadiendo elStructLayout Atributo, etc. y me sale la misma excepción.

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

Editar:

No seguí las preguntas frecuentes y formulé una pregunta que puede ser discutida pero no contestada positivamente. Aparte de eso, ha habido mucha información perspicaz en este hilo. Así que les dejaré a los lectores que voten una respuesta. El primero a más de 10 votos arriba será la respuesta. Si ninguna respuesta cumple esto en dos días (12/17 PST) agregaré mi propia respuesta que resume todo el conocimiento delicioso en el hilo :-)

Editar de nuevo:

Mentí, aceptando la respuesta de P Daddy porque él es el hombre y ha sido de gran ayuda (también tiene un lindo monito :-P)

Respuestas a la pregunta(5)

Su respuesta a la pregunta