1

SslStream新しい にオブジェクトを作成しようとしていますAppDomain。ただし、BeginAuthenticateAsClientストリームでメソッドを実行すると、例外がスローされます。

internal class SslWrapper : MarshalByRefObject
{
    public void CreateStream(Stream innerStream)
    {
        var ioStream = new SslStream(innerStream, 
                                     false,
                                     ValidateRemoteCertificate,
                                     SelectLocalCertificate);

        ioStream.BeginAuthenticateAsClient("Target",
                                           GetCertificates(),
                                           SslProtocols.Tls,
                                           false,
                                           new AsyncCallback(CallbackMethod), 
                                           null);
    }

    private void CallbackMethod(IAsyncResult result)
    {
        // TODO: handle callback...
    }
}

例外は次のように述べています。

Assembly System、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089 の System.Net.AsyncProtocolRequest 型は、シリアル化可能としてマークされていません。

編集:を呼び出した後に例外がスローされBeginAuthenticateAsClient()ます。SelectLocalCertificate()コールバック メソッドが呼び出されますが、呼び出されませValidateRemoteCertificate()ん。

新しいAppDomainSslWrapperは次のように作成されます。

_appDomain = AppDomain.CreateDomain(name, null, new AppDomainSetup { PrivateBinPath = pathToDll });
_wrapper = (SslWrapper)_appDomain.CreateInstanceFromAndUnwrap(pathToDll, typeof(SslWrapper).FullName);
_wrapper.CreateStream(innerStream);

AuthenticateAsClient()デフォルトで非同期コードを実行する場合と同様に、代わりに同期を使用すると正常に動作しますAppDomain

例外は AsyncCallback メソッドに関連していると思います。ただし、このメソッドは AppDomain の境界を越えてはならないのに、なぜ例外が発生するのでしょうか? さらに重要なことに、それを回避することは可能ですか?

.NET 2、WinXP 64bit を使用しています。

編集:これは .NET 4 の問題でもあります。

4

1 に答える 1

0

問題はinnerStreamオブジェクトにあるはずです。機能するには、シリアル化可能または MarshalByRefObject である必要があります (つまり、AppDomain 境界を越えてパラメーターとして渡すことができます)。

于 2012-04-18T10:07:29.110 に答える