.NET Interop IntPtr против реф

Вероятно, вопрос нуб, но взаимодействие неЭто одна из моих сильных сторон.

Помимо ограничения количества перегрузок, есть ли причина, по которой я должен объявить свои DllImports как:

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

И используйте их так:

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

Вместо создания целевой перегрузки:

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

И используя это как:

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

Перегрузка с помощью ref становится проще в использовании, но ямне интересно, есть ли недостаток, что яЯ не в курсе.

Редактировать:

Пока что много интересной информации, ребята.

@P Папа: У вас есть пример создания класса struct из абстрактного (или любого) класса? Я изменил свою подпись на:

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

Без ,InOut, а такжеMarshalAs SendMessage (EM_GETCHARFORMAT в моем тесте) завершается ошибкой. Приведенный выше пример хорошо работает, но если я изменю его на:

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

Я получаю исключение System.TypeLoadException, в котором говорится, что формат CHARFORMAT2 недопустим (япопробую и запечатлю здесь).

Исключение:

Не удалось загрузить типCC.Utilities.WindowsApi.CHARFORMAT2' из собранияCC.Utilities, версия = 1.0.9.1212, культура = нейтральная, PublicKeyToken = 111aac7a42f7965e ' потому что формат недействителен.

Класс NativeStruct: I '

public class NativeStruct
{
}

мы пыталисьabstract, добавивStructLayout атрибут и т. д. и я получаю то же исключение.

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

Редактировать:

Я не'Следуйте часто задаваемым вопросам, и я задал вопрос, который можно обсудить, но на который нет положительного ответа. Помимо этого было многос проницательной информацией в этой теме. Так что я'Я оставлю это до читателей, чтобы проголосовать за ответ. Первым от 10 до 10 голосов будет ответ. Если в течение двух дней (12/17 по стандартному тихоокеанскому времени) это не отвечаетЯ добавлю свой собственный ответ, который обобщает все вкусные знания в теме :-)

Изменить снова:

Я солгал, принимая P Daddy 'ответ, потому что он человек, и он мне очень помог (у него тоже есть милая маленькая обезьянка :-P)

Ответы на вопрос(5)

Ваш ответ на вопрос