BeginAuthenticateAsClient не работает в новом AppDomain

Я пытаюсь создать объект 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...
    }
}

В исключении указано:

Тип System.Net.AsyncProtocolRequest в системе сборки, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 не помечен как сериализуемый.

Изменить. Исключение возникает после вызова BeginAuthenticateAsClient(). Метод обратного вызова SelectLocalCertificate() вызывается, а ValidateRemoteCertificate() нет.

Новые AppDomain и SslWrapper создаются следующим образом:

_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.


person g t    schedule 30.01.2012    source источник


Ответы (1)


проблема должна быть в вашем объекте innerStream, он должен быть сериализуемым или MarshalByRefObject для работы (т.е. иметь возможность передаваться как параметр через границу AppDomain)

person Ventsyslav Raikov    schedule 18.04.2012
comment
Но он передается без проблем в вызове _wrapper.CreateStream(innerStream). Это только обратный вызов, который терпит неудачу. - person g t; 18.04.2012
comment
как именно "не получается"? в какой строке вы получаете исключение? - person Ventsyslav Raikov; 18.04.2012
comment
Сразу после вызова BeginAuthenticationAsClient() создается исключение SerializationException. - person g t; 13.06.2012