MemoryStream,无法访问已关闭的流

时间:2011-11-11 22:11:06

标签: .net pdf-generation memorystream sharppdf

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

  

无法访问已关闭的流。

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

1 个答案:

答案 0 :(得分:37)

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

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

Dim email As New EmailService
email.Send(ms)

请注意,在MemoryStream的已关闭/处置的实例上调用MemoryStream.ToArray是完好的。它甚至记录在案:

  

注意
  当MemoryStream关闭时,此方法有效。