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