2

メソッドSslStreamを使用してから通常どおり読み取ると、期待される結果が得られます。Read(byte[] buffer, int offset, int count)

ただし、SslStreamオブジェクトを newに移動するAppDomainと、読み取りは引き続き正しく機能しているように見えます (つまり、正しい読み取りバイト数が返されます) が、buffer配列は空です。

どうしてこれなの?

4

2 に答える 2

6

調査の結果、パラメーター配列の内容が AppDomains 間でマーシャリングされていないようです (おそらくパフォーマンス上の理由から)。

したがって、bufferパラメーター内のデータは一方向にのみ渡されます。リモート AppDomain の配列への変更は、ローカル AppDomain の呼び出し元には表示されません。

配列パラメーター内のデータを強制的に返す方法は、[Out]属性をパラメーターに追加することです。

質問に記載されている問題を解決するには、のラッパー クラスを作成し、SslStream代わりにそれを使用します。

[Serializable]
internal class SslStreamWrapper : SslStream
{
    public SslStreamWrapper(
        Stream innerStream,
        Boolean leaveInnerStreamOpen,
        RemoteCertificateValidationCallback validationCallback,
        LocalCertificateSelectionCallback selectionCallback)
     : base(innerStream, leaveInnerStreamOpen, validationCallback, selectionCallback)
    {
    }

    // Add the [Out] attribute to the 'buffer' parameter.
    public override Int32 Read([In, Out] Byte[] buffer, Int32 offset, Int32 count)
    {
        return base.Read(buffer, offset, count);
    }
}

このクラスには[Serializable]属性があり、AppDomains 間で渡すことができます。また[In]、他の Stream クラスとの一貫性のために暗黙的なパラメーターが含まれています。

から継承する他の多くの .NET クラスStream(MemoryStreamおよびBufferedStream- やそれStream自体など) には、メソッド内のパラメーターの[In, Out]属性が含まれています。bufferRead()

それらを省略したのは意図的な選択だったのだろうかSslStream...これは.NETのすべてのバージョンに当てはまります。

于 2012-06-20T06:25:18.403 に答える