1

PDFドキュメントを保存してWebBrowserコントロールに表示するVB.NETユーザーコントロールがあります。コードは次のようになります。

Using myPdfDoc As New FileStream(fileName, FileMode.Create)
    Dim byt As Byte() = comLib.GetData();
    If Not byt Is Nothing Then                        
        myPdfDoc.Write(byt, 0, byt.Length)
        myPdfDoc.Flush()
        myPdfDoc.Close()

        webBrowserCtl.Navigate(fileName)
    End If
End Using

comLibは、関連データを取得するVB6で記述されたCOM相互運用ライブラリです。

私の知る限り、このコードはPDFドキュメントへの参照を保持しています(プログラムの終了時にVB.NETは閉じないため)。この記事は、adobeがそれ自体の後で適切にクリーンアップされないことを示唆しているように見えますが、提案された変更を実装しても役に立たないようです。

なぜ私はこの振る舞いをするのでしょうか?VB6では、プログラムが正しく閉じられなかったのは、常に、クリアされていない漂遊オブジェクト参照の結果でした。これはVB.NETでも当てはまりますか?もしそうなら、どのオブジェクトを識別するために何ができますか、またはなぜこれが起こっている可能性がありますか?

4

2 に答える 2

1

私はこれを分離します:データの読み取り、データの書き込み、およびデータの表示:

Dim byt As Byte() = Nothing
Try
  byt = comLib.GetData()
Finally
  If Not comLib Is Nothing Then
    Marshal.ReleaseComObject(comLib)
  End If
End Try

If Not byt Is Nothing Then
  Using myPdfDoc As New FileStream(fileName, FileMode.Create)
    myPdfDoc.Write(byt, 0, byt.Length)
  End Using

  Using webBrowserCtl As New WebBrowser()
    webBrowserCtl.Navigate(fileName)      
  End Using
End If  

FinalのMarshal.ReleaseComObject呼び出しは、参照カウントが常にデクリメントされることを保証します。Disposeはとにかくこれを行うので、FlushとCloseは必要ありません。WebBrowserコントロールはIDisposableを実装しているので、そのためにもUsingブロックを使用しました。

于 2011-06-02T16:22:56.783 に答える
0

あなたは私が過去にしたことよりもずっと複雑なことをしている。しかし、.NETのPDFバイトオブジェクトは、(廃棄されたとしても)非常に大量のメモリを消費する可能性があることをお伝えできます。ファイルサーバー(Webサーバーを実行しているマシンの実際のディレクトリ)で一時ファイルを使用することをお勧めします。オブジェクトをメモリに保持するのではなく。アセンブリPDFSharpには、使用できる優れた(そして無料の)コードがあることを私は知っています。しかし、私はあなたのプログラムが終了するのを妨げるものが何であるかわかりません。あなたの相棒に頑張ってください。

PS:自分でガベージコレクターを呼び出してみてください。そして、VisualStudioでスレッドを表示できるはずです。w3wp.exe(Windows7ではIIS7プロセス)プロセスに接続すると、コンテキストメニュー([デバッグ]-> [Windows]-> [スレッド])が表示されます。COMスレッドがそこに表示されるかどうかはわかりませんが。

于 2011-05-25T15:50:54.787 に答える