MemoryStream,无法访问已关闭的流

bre*_*dog 13 .net pdf-generation memorystream sharppdf

使用sharpPDF库我生成一个pdf内存流,我想通过电子邮件直接发送它.但行ms.Seek(....给出一个ObjectDisposedException;

无法访问封闭的Stream.

pdf.CreatePDF方法接受(输出)fileName字符串或(out)Stream.但我想它也关闭了流?我不习惯在溪流上工作太多,所以如果你能告诉它应该怎么做?

可以在此处找到CreatePDF方法的sharpPDF源代码:

http://www.java2s.com/Open-Source/CSharp/PDF/SharpPDF/sharpPDF/pdfDocument.cs.htm

Public Sub SendPDF()
   Dim pdf As New sharpPDF.pdfDocument("Title", "Author")

   '....Generate pdf content

   Dim ms As New IO.MemoryStream
   pdf.CreatePDF(ms)

   Dim email As New EmailService
   email.Send(ms)

End Sub

Public Class EmailService
   Public Sub Send(Byval ms as Stream)
        ms.Seek(0, IO.SeekOrigin.Begin)

        Dim atc As New Attachment(ms, "Report.pdf")
        mail.Attachments.Add(atc)

        '....set other email parameters

        client.SendAsync(mail, mail.Subject)
  End Sub 
End Class
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 38

一种简单的方法是从已关闭的MemoryStream中获取字节数组并创建另一个:

pdf.CreatePDF(ms)
ms = new MemoryStream(ms.ToArray())

Dim email As New EmailService
email.Send(ms)
Run Code Online (Sandbox Code Playgroud)

请注意,调用MemoryStream.ToArray已关闭/处理的实例是可以的MemoryStream.它甚至记录在案:

注意
此方法在MemoryStream关闭时有效.

  • Jon,如果OP得到一个ObjectDisposedException,那么就不可能访问任何成员(假设Disposable模式的良好实现)? (2认同)
  • @Charles:不 - 你仍然可以在已经处理好的MemoryStream上调用ToArray.将编辑以使此清楚. (2认同)