AssemblyResolve не вызывается и FileNotFoundException бросается во время сериализации

В моем приложении ASP.NET класс MyAssembly.CustomIdentity и .NET runtime пытается сериализовать этот класс. Во время сериализации он бросает FileNotFoundException, жалуясь, что не может загрузить MyAssembly.

[SerializationException: Unable to find assembly 'MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.]
 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9464367
 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +345
 System.AppDomain.get_Id() +0
 <crtimplementationdetails>.DoCallBackInDefaultDomain(IntPtr function, Void* cookie) +151
 <crtimplementationdetails>.DefaultDomain.Initialize() +30
 <crtimplementationdetails>.LanguageSupport.InitializeDefaultAppDomain(LanguageSupport* ) +41
 <crtimplementationdetails>.LanguageSupport._Initialize(LanguageSupport* ) +391
 <crtimplementationdetails>.LanguageSupport.Initialize(LanguageSupport* ) +65
 [ModuleLoadException: The C++ module failed to load while attempting to initialize the default appdomain.]
 <crtimplementationdetails>.ThrowModuleLoadException(String errorMessage, Exception innerException) +61
 <crtimplementationdetails>.LanguageSupport.Initialize(LanguageSupport* ) +113
 .cctor() +46
 [TypeInitializationException: The type initializer for '<module>' threw an exception.]
 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeEnvironment() +0
 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment..cctor() +809
 [TypeInitializationException: The type initializer for 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' threw an exception.]
 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.get_IsAvailable() +17
 SampleWebApp.Default.Page_Load(Object sender, EventArgs e) in C:\Temp\AzureAdvancedRolesSource\Ex2-StartupTasks\CS\Begin\SampleWebApp\Default.aspx.cs:22
</module></crtimplementationdetails></crtimplementationdetails></crtimplementationdetails></crtimplementationdetails></crtimplementationdetails></crtimplementationdetails></crtimplementationdetails>

Я искал и выглядел как обработка AppDomain.AssemblyResolve событие должно помочь. Поэтому я реализовал обработку этого события:

public partial class Default : System.Web.UI.Page
{
 static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
 {
 return typeof(MyAssembly.CustomIdentity).Assembly;
 }
 protected void Page_Load(object sender, EventArgs e)
 {
 AppDomain currentDomain = AppDomain.CurrentDomain;
 currentDomain.AssemblyResolve +=
 new ResolveEventHandler(MyResolveEventHandler);
 // this code throws `FileNotFoundException`
 // during a serialization attempt
 bool isAvailable =
 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable;
 }
}

однако мой обработчик не вызывается, и у меня все еще есть одно и то же исключение во время попытки сериализации. Как решить эту проблему - как заставить сериализатор найти мою сборку?

1 ответ

Проблема может быть связана с тем, что CLR пытается найти все сборки при запуске вызова метода, поэтому он ищет сборку перед подключением обработчика событий для события AssemblyResolve. Чтобы решить проблему, вы можете извлечь код, который нуждается в вашей сборке, в отдельный метод и вызвать его из Page_Load.

Смотрите этот блог для получения более подробной информации: AppDomain.AssemblyResolve Event Tips

licensed under cc by-sa 3.0 with attribution.