MemoryStream, не удается получить доступ к закрытому потоку - PullRequest
13 голосов
/ 12 ноября 2011

С библиотекой sharpPDF я создаю поток памяти в формате pdf и хочу отправить его напрямую по электронной почте. Но строка ms.Seek (.... дает исключение ObjectDisposedException;

Невозможно получить доступ к закрытому потоку.

Метод pdf.CreatePDF принимает либо (выходную) строку fileName, либо (выходной) поток. Но я думаю, это также закрывает поток? Я не привык много работать с потоками, поэтому, пожалуйста, посоветуйте, пожалуйста, как это сделать?

Исходный код sharpPDF метода CreatePDF можно найти здесь:

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 Ответ

37 голосов
/ 12 ноября 2011

Один простой подход - извлечь массив байтов из закрытого MemoryStream и создать еще один:

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

Dim email As New EmailService
email.Send(ms)

Обратите внимание, что нормально вызывать MemoryStream.ToArray на закрытом / удаленном экземпляре MemoryStream. Это даже задокументировано:

Примечание
Этот метод работает, когда MemoryStream закрыт.

...