Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Help on TypeLoadException

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?

like image 611
Alex Essilfie Avatar asked Apr 29 '26 20:04

Alex Essilfie


1 Answers

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
like image 117
Paul Alexander Avatar answered May 02 '26 10:05

Paul Alexander