В проекте .NET 3.0 мне нужно сделать несколько вызовов через P / Invoke (в частности, для функций поставщика PrintTicket, таких как PTConvertPrintTicketToDevMode ()).
Платформа имеет управляемое определение интерфейса COM IStream: System.Runtime.InteropServices.ComTypes.IStream
Мне это нужно как System.IO.Stream, чтобы я мог легко использовать классы .NET (например, XmlDocument) с выводом этих импортированных функций. Но я не вижу менее болезненного способа преобразования этого взад и вперед в System.IO.Stream, кроме чтения и записи данных по блоку байтов за раз. Это кажется слишком беспорядочным для задачи, которая могла бы казаться очень распространенной.
Или я ошибаюсь?
У меня PTConvertPrintTicketToDevMode () импортирован как:
[DllImport("prntvpt.dll")]
public static extern int
PTConvertPrintTicketToDevMode(IntPtr hProvider,
IStream pPrintTicket,
EDefaultDevmodeType baseDevmodeType,
EPrintTicketScope scope,
IntPtr pcbDevmode,
out IntPtr ppDevmode,
[MarshalAs(UnmanagedType.BStr)]out String pbstrErrorMessage);





Это не совсем просто (т.е. в структуре нет встроенного способа сделать это), но идея состоит в том, чтобы реализовать класс, реализующий System.Runtime.InteropServices.ComTypes.IStream. Вот статья с кодом. В статье не реализован метод Write, но на его написание должно уйти еще 10 минут. Проверить это. http://www.sturmnet.org/blog/archives/2005/03/03/cds-csharp-extractor
Вам не нужно PInvoke, тип PrintTicketConverter в .Net уже делает это за вас
Благодарю. это был один из способов, на который я смотрел. Я просто не мог поверить, они сделали IStream без обертки.