3

In my ASP.NET application there's MyAssembly.CustomIdentity class and the .NET runtime tries to serialize that class. During serialization it throws FileNotFoundException complaining it can't load 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 

I searched and looks like handling AppDomain.AssemblyResolve event should help. So I implemented handling that event:

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; } } 

however my handler is not invoked and I still have the same exception during a serialization attempt. How do I resolve this problem - how do I make the serializer find my assembly?

4
  • What's the exception message? Commented Jun 27, 2011 at 13:13
  • For starters, you shouldn't blindly return your assembly; you need to check args to see what it is asking for... but: what is the exception message now? Commented Jun 27, 2011 at 13:15
  • @SLaks, @Marc Gravell:: I added the call stack and I guess it provided the message with the greatest details. Commented Jun 27, 2011 at 13:24
  • @Marc Gravell: Yes, I thought to look at args to deduce what to check for and now it turns out the handler is not even called. Commented Jun 27, 2011 at 13:25

1 Answer 1

4

The issue can be related to the fact that CLR tries to locate all assemblies when it starts invoking a method so it looks for the assembly before you wire up the event handler for AssemblyResolve event. To solve the issue you can extract the code that needs your assembly into a separate method and invoke it from Page_Load.

See this blog for more details: AppDomain.AssemblyResolve Event Tips

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.