Frage

Ich schreibe eine .NET 3.5 -Anwendung (WinForms), die Klassen aus einer externen DLL verwendet, und ich erhalte weiter a System.TypeLoadException Jedes Mal, wenn die Anwendung versucht zu starten.
Hier ist die Ausnahme gegen Anzeigen:

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: 

Hier ist der Code, den ich ausführe:

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



Was mich überrascht, ist, dass der VS2010 -Debugger auf der Linie stoppt App.Initialize() ohne in die zu treten Initialize Funktion.

Wenn ich jedoch alle Verweise auf die externe DLL in der Initialize Funktion, die Anwendung initialisiert ordnungsgemäß.


Nach dem Lesen stellte ich fest, dass eine Reihe von Personen, die diesen Fehler meldeten, verschiedene Builds in ihren Projekten verwendete (wie in X64 DLL aus einer X86 -Anwendung verwiesen). Ich habe daher die Build -Konfiguration geändert, damit die DLL und die Anwendung beide x86 waren, aber ich habe immer noch die TypeLoadException.

Fehlt mir etwas?

War es hilfreich?

Lösung 2

Es scheint, dass einer Nussy auch eine hatte Ähnliches Problem Und er löste es, indem er alle Klassen, Formen und Kontrollen in ein neues Projekt kopierte. Ich habe es ebenfalls getan und das Problem wurde gelöst.

Danke, Jim Mischel und Paul Alexander für Ihre Hilfe. Ich habe Sie für Ihre Bemühungen gestimmt, mir zu helfen, das Problem zu lösen.

Andere Tipps

Sie sollten sich die Eigenschaften der Innerexception und Loadexception ansehen, um ein besseres Detail darüber zu erhalten, warum die abhängige Baugruppe nicht ordnungsgemäß geladen wird.

Der Grund, warum es die Ausnahme auswirft Vor Initialize ist auf die Art und Weise zurückzuführen, wie die Methode zusammengestellt wird. Wenn beim ersten Mal eine Methode ausgeführt wird, validiert und löst der CLR alle MSIL -Anweisungen in dieser Methode vor, bevor sie in das Laufzeitäquivalent zusammengestellt wird. Da der polymorph.common.setings -Typ nach der Initialisierungsmethode verwendet wird, versucht der CLR, ihn beim Kompilieren aufzulösen. Da die Last fehlschlägt, wird Initialize nie ausgeführt.

Um die Ausnahme in Ihrem eigenen Code zu erfassen, verschieben Sie einfach den gesamten Initialisierungscode auf eine andere Methode und rufen Sie diese Methode in einen Versuch auf ... Fangen Sie den Block von Initialize an.

Try
    InitializeInternal()
Catch ex As TypeLoadException
    System.Diagnostics.Debugger.WriteLine(ex.ToString())
End Try

Die wahrscheinlichste Ursache ist, dass es eine Ausnahme macht, wenn versucht wird, eine der Einstellungen zu laden. Sie können versuchen, bei der ersten Anweisung in der ersten Anweisung einen Haltepunkt festzulegen Initialize Methode. Dass könnte Geben Sie Ihnen die Möglichkeit, einstufig zu sein und zu sehen, wo sich der Fehler befindet.

Oder Sie könnten verwenden Debug Aussagen (siehe System.Diagnostics) Nach dem geladenen Wert, um festzustellen, wo er fehlschlägt.

Ich hatte das gleiche Problem und ich bin überzeugt, dass es sich um einen Fehler in Visualstudio oder im JIT -Compiler handelt. Ich weiß, dass es nichts mit DLLs oder X64 gegen X86 zu tun hat, da ich in meinem Testprojekt keine benutzerdefinierten Referenzen hatte. Ich habe die beleidigende Linie zu einer Mitgliedsvariablen einer Struktur aufgespürt. Diese bestimmte Mitgliedsvariable war nichts Interessantes (es war eine einfache Klasse :)

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct Foo
    {
        int x;
    }

Und es war ein Mitglied wie folgt. Es funktioniert, wenn das #if wahr war. Wenn ich es in #False ändere, kompiliert es ohne Fehler, aber dann gibt es mir zur Laufzeit, wenn ich in der gesamten Klasse überhaupt auf irgendetwas greife

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct uartparam_t
    { //size 112
        public UInt16 portnum; //0
        public Byte conntype;
        public Byte baud;
        public Byte databits;
        public Byte stopbits;
        public Byte parity;
        public Byte flowctrl;
#if true
        public int remoteip;
#else
        public Foo remoteip; //8 -- for some reason this is making the program crash! ?!?!?
#endif

     ....

das war Teil von

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct config {
 ...
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXUARTPORT)]
        public uartparam_t[] uartparam; //(size 1792)
 ...
    }

Es macht keinen Sinn. Ich habe einen vollständigen Wiederaufbau der Anwendung ausprobiert und ein neues Projekt in einer neuen Lösung erstellt, und nichts davon hat geholfen. Die einzige Möglichkeit, es zum Laufen zu bringen, bestand darin, die Struktur in ein INT zu ändern und mit der Typumwandlung von int zu foo außerhalb der Struktur umzugehen.

Ich erhalte diesen Fehler oft, wenn ich unserem Produkt Code füge. Das Problem, auf das wir stoßen, ist, dass die neueste Version des Produkts im GAC installiert ist und ich versuche, eine neue Funktion auf meiner Entwicklermaschine zu testen. Die App, die ich ausführe, hängt von einer neuen Funktion ab, die ich lokal erstellt habe, aber die App lädt die Montage aus dem GAC Wich nicht die neue Funktion. Wenn ich das Produkt deinstalliere, verschwindet die Ausnahme.

Mein Problem war die übergeordnete Versammlung und die DLL hatte den gleichen Montagennamen.

zB Application.exe und application.dll

Ich habe jeden in einen separaten Namen in den Projekteigenschaften (z. B. application.exe und bibliothek.dll) geändert und das Problem behoben. Ich denke, die ausgewählte Antwort ("Übertragung auf eine neue Lösung"), die sie auch neu nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top