メソッド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]属性が含まれています。bufferRead()
それらを省略したのは意図的な選択だったのだろうかSslStream...これは.NETのすべてのバージョンに当てはまります。