.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);
Без ,In
Out
, а также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)