メソッドSslStream
を使用してから通常どおり読み取ると、期待される結果が得られます。Read(byte[] buffer, int offset, int count)
ただし、SslStream
オブジェクトを newに移動するAppDomain
と、読み取りは引き続き正しく機能しているように見えます (つまり、正しい読み取りバイト数が返されます) が、buffer
配列は空です。
どうしてこれなの?
メソッドSslStream
を使用してから通常どおり読み取ると、期待される結果が得られます。Read(byte[] buffer, int offset, int count)
ただし、SslStream
オブジェクトを newに移動するAppDomain
と、読み取りは引き続き正しく機能しているように見えます (つまり、正しい読み取りバイト数が返されます) が、buffer
配列は空です。
どうしてこれなの?
調査の結果、パラメーター配列の内容が 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]
属性が含まれています。buffer
Read()
それらを省略したのは意図的な選択だったのだろうかSslStream
...これは.NETのすべてのバージョンに当てはまります。