1

私は、サードパーティの .NET ライブラリを使用する VB.net アプリケーションを作成しています (ただし、必要に応じて C# で回答できますが、問題ありません)。特に、このライブラリの 1 つのメソッドは IO.Stream を入力として取り (とりわけ)、その処理の結果をそのストリームに書き込みます。私の問題は、メソッドがストリームに書き込んだ後にストリームを閉じることです。そのため、ストリームに書き込んだデータを読み戻すことができません!

より具体的に言うと、もちろん、ストリームが FIeStream の場合、ディスクにデータを書き込むため機能しますが、データをメモリに直接読み取りたい場合はどうすればよいでしょうか? 私はMemoryStreamを使用してみましたが、私が言ったように、メソッドがストリームを返すと、ストリームはすでに閉じられており、そこから何も読み取ることができません:(

編集:「usr」が提案したものと同様のことを行うことで解決しました。誰かが必要な場合のコードは次のとおりです。

    Imports System.IO

Public Class CloseHijackedMemoryStream
    Inherits MemoryStream

    Public Overrides Sub Close()
        'We don't do anything, so the stream is still open
    End Sub

    Public Sub RealClose()
        MyBase.Close()
    End Sub
End Class
4

3 に答える 3

1

すべての呼び出しを基になる (ラップされた) ストリームに転送するが、Close 呼び出しと Dispose 呼び出しは転送しないストリームの周りにラッパー クラスを作成できます。これにより、ライブラリが閉じられなくなります。

Stream から派生し、「内部ストリーム」を ctor 引数として取り、内部ストリームに委譲することによってすべてのメソッドを実装します。

于 2012-06-04T11:41:16.693 に答える
1

MemoryStream には、内容全体を返す ToArray() メソッドがあります。簡単なテストを行ったところ、閉じた後も(処分した後でも)動作するようです

于 2012-06-04T11:44:02.343 に答える
1

この場合、MemoryStream からカスタム タイプ 'MyMemoryStream' を作成し、Dispose および close メソッドをオーバーライドできます。

public class MyMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
    }
}

それが役に立てば幸い。

于 2012-06-04T11:57:44.563 に答える