System.Runtime.InteropServices.ComTypes.IStream到System.IO.Stream

在.NET 3.0项目中,我需要通过P / Invoke进行一些调用(特别是对于PrintTicket Provider函数,如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,.Net中的PrintTicketConverter类型已经为你做了这个