I'm writing a .NET 3.5 application (WinForms) which uses classes from an external DLL and I keep receiving a System.TypeLoadException every time the application tries to start.
Here is the exception VS displays:
System.TypeLoadException was unhandled
Message=Could not load type 'PolyMorph.Common.Settings' from assembly 'PolyMorph, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
Source=PolyMorph
TypeName=PolyMorph.Common.Settings
StackTrace:
at PolyMorphApp.App.Initialize()
at PolyMorphApp.App.Main()
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Here is the code that I'm running:
Friend NotInheritable Class App
<STAThread()> Shared Sub Main()
'set the exception handlers'
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
'initialize the application'
App.Initialize()
'and then run the application'
Dim mainForm As New PolymorphHost
Application.Run(mainForm)
End Sub
Shared Function Initialize() As FunctionResult
If App.InitializeDataDirectory() = False Then
Return New FunctionResult(False, "the application's data directory")
End If
_settings = New PolyMorph.Common.Settings(AppDataDirectory & "\Settings.dat")
......code continues to load settings from the _settings variable
End Function
End Class
What surprises me is that the VS2010 Debugger stops on the line App.Initialize() without even stepping into the Initialize function.
If, however, I comment out all references to the external DLL in the Initialize function, the application initializes properly.
After reading around, I realized that a number of people reporting this error were using different builds on their projects (as in x64 DLL being referenced from an x86 application). I therefore changed the build configuration so the DLL and the application were both x86 but I still have the TypeLoadException.
Is there anything I'm missing?
You should look at the InnerException and LoadException properties to get a better detail on why the dependent assembly isn't loading properly.
The reason it's throwing the exception before Initialize is due to the way the method is JIT compiled. When a method is executed the first time, the CLR will validate and resolve all of the MSIL instructions in that method before compiling it into it's runtime equivalent. Since the PolyMorph.Common.Settings type is used by the Initialize method, the CLR tries to resolve it when compiling. Since the load fails, Initialize is never executed.
to capture the exception in your own code, just move the entire Initialize code to another method, then invoke that method in a try...catch block from Initialize.
Try
InitializeInternal()
Catch ex As TypeLoadException
System.Diagnostics.Debugger.WriteLine(ex.ToString())
End Try
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With