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?

Community
  • 1
  • 1
sharptooth
  • 167,383
  • 100
  • 513
  • 979
  • What's the exception message? – SLaks Jun 27 '11 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? – Marc Gravell Jun 27 '11 at 13:15
  • @SLaks, @Marc Gravell:: I added the call stack and I guess it provided the message with the greatest details. – sharptooth Jun 27 '11 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. – sharptooth Jun 27 '11 at 13:25

1 Answers1

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

Giorgi
  • 30,270
  • 13
  • 89
  • 125