Question

Je vous écris une application .NET 3.5 (WinForms) qui utilise des classes d'une DLL externe et je continue à recevoir un System.TypeLoadException chaque fois que les essais d'application pour commencer.
Voici l'exception VS affiche:

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: 

Voici le code que je suis en cours d'exécution:

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


Ce qui me surprend est que le Débogueur VS2010 arrête sur la ligne App.Initialize() sans marcher, même dans la fonction Initialize.

Si, cependant, je commenter toutes les références à la DLL externe dans la fonction Initialize, l'application initialise correctement.


Après avoir lu autour, j'ai réalisé qu'un certain nombre de personnes déclarant cette erreur utilisaient différents se base sur leurs projets (comme référencé à partir d'une application x86 DLL 64 bits). J'ai donc changé la configuration de construction de sorte que la DLL et l'application étaient x86 mais je dois encore le TypeLoadException.

Y at-il quelque chose que je suis absent?

Était-ce utile?

La solution 2

Il semble un Nutzy avait aussi une problème similaire et il a résolu en copiant toutes les classes, des formulaires et des contrôles à un nouveau projet. Je l'ai fait de même et le problème a été résolu.

Merci, Jim Mischel et Paul Alexander pour votre aide. Je vous voté pour vos efforts pour me aider à résoudre le problème.

Autres conseils

Vous devriez regarder les propriétés InnerException et LoadException pour obtenir un meilleur détail pourquoi l'ensemble dépendant ne se charge pas correctement.

La raison pour laquelle il est jeter l'exception avant Initialize est due à la façon dont la méthode est JIT compilé. Lorsqu'une méthode est exécutée la première fois, le CLR valider et résoudre toutes les instructions MSIL dans cette méthode avant de compiler dans son équivalent d'exécution. Étant donné que le type PolyMorph.Common.Settings est utilisé par la méthode Initialize, les essais CLR pour le résoudre lors de la compilation. Étant donné que la charge échouent, est jamais exécuté.

pour capturer l'exception dans votre propre code, il suffit de déplacer l'intégralité du code Initialiser à une autre méthode, puis Invoke cette méthode dans un bloc try ... catch de Initialize.

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

La cause la plus probable est que cela lance une exception en essayant de charger l'un des paramètres. Vous pouvez essayer de mettre un point d'arrêt à la première instruction dans la méthode Initialize. Ce peut vous donner l'occasion à une seule étape et de voir où l'erreur est.

Ou vous pouvez utiliser des instructions de Debug (voir System.Diagnostics) après chaque valeur est chargée, pour déterminer où il est défaillant.

J'ai eu le même problème, et je suis convaincu qu'il est un bogue dans VisualStudio ou le compilateur JIT. Je sais que cela n'a rien à voir avec DLL ou x64 x86 vs, puisque je ne possède aucune référence personnalisés dans mon projet de test. Je traqué la ligne heurter à une variable de membre d'une struct. Il n'y avait rien d'intéressant à propos de cette variable membre en particulier (il était une classe simple:)

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

et il a été membre comme suit. Il fonctionne si le #if était vrai. Si je change à #false, il compile sans erreur, mais au moment de l'exécution, quand j'accéder à quoi que ce soit dans la classe, il me donne le TypeLoadException

    [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

     ....

qui faisait partie

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

Il ne fait aucun sens. J'ai essayé une reconstruction complète de l'application, ainsi que la création d'un nouveau projet dans une nouvelle solution, et rien de tout cela aidé. La seule façon de l'obtenir au travail était de changer la structure à un int, et faire face à la conversion du type int Foo en dehors de la struct.

Je reçois souvent cette erreur quand je suis en ajoutant le code à notre produit. La question que nous courons en est que la dernière version du produit est installé dans le GAC et je suis en train de tester une nouvelle fonctionnalité sur ma machine de développeur. L'application que je lance dépend d'une nouvelle fonctionnalité que je construis sur place, mais les charges d'application l'assemblage du GAC Wich ne contient pas la nouvelle fonctionnalité. Quand je désinstaller le produit, l'exception disparaît.

Mon problème était l'assemblée des parents et la DLL avait le même nom d'assemblage.

par exemple. Application.exe et Application.dll

I changé chacun à un nom distinct dans les propriétés du projet (par exemple application.exe et Library.dll) et résolu le problème. Je suppose que la réponse choisie ( « le transfert vers une nouvelle solution ») ils sont re-nommer les projets ainsi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top