为什么跨越AppDomains从SslStream读取成功但返回空缓冲区?

g t*_*g t 2 c# attributes appdomain marshalling sslstream

SslStream使用该Read(byte[] buffer, int offset, int count)方法正常阅读时,我得到了预期的结果.

但是,如果我将SslStream对象移动到一个新对象AppDomain,则读取仍然可以正常工作(即返回正确读取的字节数),但该buffer数组为空.

为什么是这样?

g t*_*g t 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

该类具有该[Serializable]属性,允许它在AppDomains之间传递,并且包含隐式[In]参数以与其他Stream类保持一致.

继承的许多其他.NET类Stream(例如MemoryStreamBufferedStream- 甚至Stream自身)都包含方法中参数的[In, Out]属性.bufferRead()

我想知道是否故意选择省略它们SslStream......这适用于所有版本的.NET.