some investigation 之后,参数数组的内容似乎没有跨 AppDomain 编组(可能出于性能原因)。
因此,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] 属性,允许它在AppDomain 之间传递,并且包含隐式[In] 参数以与其他Stream 类保持一致。
许多其他继承自Stream 的.NET 类(例如MemoryStream 和BufferedStream - 甚至Stream 本身)在Read() 方法中包含buffer 参数的[In, Out] 属性。
我想知道为SslStream 省略它们是否是故意选择...这适用于所有版本的 .NET。