Помощь по TypeLoadException - PullRequest
       6

Помощь по TypeLoadException

3 голосов
/ 27 декабря 2010

Я пишу приложение .NET 3.5 (WinForms), которое использует классы из внешней DLL, и я продолжаю получать System.TypeLoadException каждый раз, когда приложение пытается запустить.
Вот исключение, которое отображает VS:

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: 

Вот код, который я запускаю:

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

Что меня удивляет, так это то, что отладчик VS2010 останавливается на линии App.Initialize(), даже не заходя в функцию Initialize.

Если, однако, я закомментирую все ссылки на внешние библиотеки DLL в функции Initializeприложение правильно инициализируется.


После прочтения я понял, что некоторые люди, сообщающие об этой ошибке, используют разные сборки в своих проектах (как в x64 DLL, на которую ссылается приложение x86).Поэтому я изменил конфигурацию сборки, чтобы DLL и приложение были x86, но у меня все еще есть TypeLoadException.

Есть ли что-то, что я пропускаю?

Ответы [ 6 ]

4 голосов
/ 27 декабря 2010

Вам следует взглянуть на свойства InnerException и LoadException, чтобы получить более подробную информацию о том, почему зависимая сборка загружается неправильно.

Причина, по которой выдается исключение до Инициализация вызвана тем, что метод JIT скомпилирован. Когда метод выполняется в первый раз, CLR проверит и разрешит все инструкции MSIL в этом методе, прежде чем скомпилировать его в эквивалент времени выполнения. Поскольку тип PolyMorph.Common.Settings используется методом Initialize, CLR пытается разрешить его при компиляции. Поскольку загрузка не удалась, Initialize никогда не выполняется.

чтобы захватить исключение в вашем собственном коде, просто переместите весь код Initialize в другой метод, а затем вызовите этот метод в блоке try ... catch из Initialize.

Try
    InitializeInternal()
Catch ex As TypeLoadException
    System.Diagnostics.Debugger.WriteLine(ex.ToString())
End Try
2 голосов
/ 28 декабря 2010

Похоже, у одного Нутзи тоже была похожая проблема , и он решил ее, скопировав все классы, формы и элементы управления в новый проект.Я поступил так же, и проблема была решена.

Спасибо, Джим Мишель и Пол Александр за вашу помощь.Я проголосовал за ваши усилия, чтобы помочь мне решить проблему.

1 голос
/ 08 октября 2011

У меня была такая же проблема, и я убежден, что это ошибка в VisualStudio или JIT-компиляторе. Я знаю, что это не имеет ничего общего с DLL или x64 против x86, так как у меня не было пользовательских ссылок в моем тестовом проекте. Я проследил оскорбительную строку до переменной-члена структуры. В этой конкретной переменной-члене не было ничего интересного (это был простой класс:)

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

и это был член следующим образом. Это работает, если #if было правдой. Если я изменяю его на #false, он компилируется без ошибок, но затем во время выполнения, когда я получаю доступ к чему-либо вообще во всем классе, это дает мне 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

     ....

который был частью

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

Это не имеет никакого смысла. Я попытался полностью перестроить приложение, а также создать новый проект в новом решении, и ничего из этого не помогло. Единственный способ заставить его работать - изменить структуру на int и заняться преобразованием типов из int в Foo вне структуры.

1 голос
/ 27 декабря 2010

Наиболее вероятная причина - это исключение при попытке загрузить одну из настроек. Вы можете попытаться установить точку останова в первом операторе в методе Initialize. Это может дать вам возможность сделать один шаг и посмотреть, где ошибка.

Или вы можете использовать операторы Debug (см. System.Diagnostics) после загрузки каждого значения, чтобы определить, где оно выходит из строя.

0 голосов
/ 12 декабря 2012

Моя проблема заключалась в том, что родительская сборка имела одно и то же имя.например, Application.exe и Library.dll), и это решило проблему.Я думаю, что выбранный ответ («переход к новому решению») также переименовывает проекты.

0 голосов
/ 10 сентября 2012

Я часто получаю эту ошибку, когда добавляю код в наш продукт.Проблема, с которой мы сталкиваемся, заключается в том, что в GAC установлена ​​последняя версия продукта, и я пытаюсь протестировать новую функцию на моем компьютере разработчика.Приложение, которое я запускаю, зависит от новой функции, которую я создаю локально, но приложение загружает сборку из GAC, которая не содержит новую функцию.Когда я удаляю продукт, исключение исчезает.

...