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