I have an ASP.NET MVC web application in which I am getting an error on startup. The global asax.cs calls into ApplicationSettings.cs which has a check to ServiceRuntime.RoleEnvironment.IsAvailable to load settings from one of cloud settings or app settings (but that is not important). This is the exception thrown:
Microsoft.WindowsAzure.ServiceRuntime Critical: 102 : Unexpcted Exception During Runtime Startup:
System.TypeInitializationException: The type initializer for '<Module>' threw an exception. ---> <CrtImplementationDetails>.ModuleLoadException: The C++ module failed to load while attempting to initialize the default appdomain.
---> System.Runtime.Serialization.SerializationException: Type is not resolved for member 'Test.Common.Logging.Tracing.TracingContext,Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
at System.AppDomain.get_Id()
at <CrtImplementationDetails>.DoCallBackInDefaultDomain(IntPtr function, Void* cookie)
at <CrtImplementationDetails>.LanguageSupport.InitializeDefaultAppDomain(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
--- End of inner exception stack trace ---
at <CrtImplementationDetails>.ThrowModuleLoadException(String errorMessage, Exception innerException)
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
at .cctor()
--- End of inner exception stack trace ---
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeEnvironment()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment..cctor()
[2022-06-25 22:29:43] DiagnosticLogs:
Message [The type initializer for 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' threw an exception.]
LogSeverityLevel [Error]
InnerException [System.TypeInitializationException: The type initializer for '<Module>' threw an exception. ---> <CrtImplementationDetails>.ModuleLoadException: The C++ module failed to load while attempting to initialize the default appdomain.
---> System.Runtime.Serialization.SerializationException: Type is not resolved for member 'Test.Common.Logging.Tracing.TracingContext,Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
at System.AppDomain.get_Id()
at <CrtImplementationDetails>.DoCallBackInDefaultDomain(IntPtr function, Void* cookie)
at <CrtImplementationDetails>.LanguageSupport.InitializeDefaultAppDomain(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport._Initialize(LanguageSupport* )
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
--- End of inner exception stack trace ---
at <CrtImplementationDetails>.ThrowModuleLoadException(String errorMessage, Exception innerException)
at <CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
at .cctor()
--- End of inner exception stack trace ---
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeEnvironment()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment..cctor()]
StackTrace [ at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.get_IsAvailable()
at Test.Business.Utility.ApplicationSettings.GetCloudOrAppSetting(String propertyName, String defaultPropertyValue, Boolean useCache) in C:\test\Applications\Test\Test.Business\Utility\ApplicationSettings.cs:line 58
at Test.Business.Utility.ApplicationSettings.LoadDySettings() in C:\test\Applications\Test\Test.Business\Utility\ApplicationSettings.cs:line 109
at TestUserProfile.Global.Application_Start(Object sender, EventArgs e) in C:\test\Applications\Test\TestUserProfile\Global.asax.cs:line 70]
TraceActivityId [bbd73ca7-f3dd-4eef-90bc-006732c617c6]
CorrelationId [051f3a29-62f4-4cc9-9854-8bd6fc02c08d]
BuildNumber [1.0.0.1]
SourceFilePath [C:\test\Applications\Test\TestUserProfile\Global.asax.cs]
SourceMethodName [Application_Start]
MachineName [SAURAV-SURFACEB]
[2022-06-25 22:29:43] Metric: Total Exception - 1, Dimensions:
Method Name [Application_Start]
This error has been happening since I added some special log tracing code which does: CallContext.LogicalSetData in Test.Common.Logging.Tracing.TracingContext.cs to track some properties of a current request on the thread. But if I remove the CallContext.LogicalSetData line, the error goes away, and the app starts up fine.
I think this has something to do with AppDomain and its initialization and the fact that CallContext.LogicalSetData sends information to a LogicalCallContext which can be in a different AppDomain. But I am not able to make sense out of it. Any help please?
Turns out that the class being serialized needed to extend
MarshalByRefObject."
MarshalByRefObjectenables access to objects across application domain boundaries in applications that support remoting".Since
RoleEnvironmentinitializes a new AppDomain, any objects fromLogicalContextneed to beMarshalByRefObjecttypes.Thanks to this link where I got the hint: https://www.codeproject.com/Questions/696736/XML-Serialization-issue-when-Logical-Call-Context