Что могло вызвать исключение System.TypeLoadException?

Я разрабатываю с VS2008 с использованием C # приложение для Honeywell Dolphin 6100, мобильного компьютера со сканером штрих-кода, который использует Windows CE 5.0, как ОС.

Я хочу добавить функцию, которая может отправлять файлы с локального устройства на удаленный сервер. Я нашел библиотеку Tamir.SharpSSH, которая может гарантировать это. Я протестировал код в консольном приложении и в обычном приложении Windows Forms, и он отлично работает. Но когда я попытался использовать тот же код на устройстве winCE, я получил исключение TypeLoadException и сообщение об ошибке:

Could not load type 'Tamir.SharpSsh.SshTransferProtocolBase' from assembly 'Tamir.SharpSSH,   
Version=1.1.1.13, Culture=neutral, PublicKeyToken=null'.

код, который я использую, выглядит следующим образом:

SshTransferProtocolBase sshCp = new Scp(Tools.GlobalVarMeth.hostName, Tools.GlobalVarMeth.serverUserName);
sshCp.Password = Tools.GlobalVarMeth.serverUserpassword;
sshCp.Connect();

string localFile = Tools.GlobalVarMeth.applicationPath + "/" + fileName + ".csv";
string remoteFile = Tools.GlobalVarMeth.serverRemoteFilePath + "/" + fileName + ".csv";

sshCp.Put(localFile, remoteFile);
   
sshCp.Close();

У кого-нибудь есть идеи по этому поводу? Буду очень признателен !!!


person J.M.J    schedule 18.04.2013    source источник
comment
Вы пытаетесь использовать настольный код или скомпилированную настольную сборку в Compact Framework? Первые могут работать (необычно, но возможно), вторые абсолютно не могут работать.   -  person ctacke    schedule 19.04.2013
comment
Возьмите библиотеку SFTP для .NET CF. Например. вы можете воспользоваться нашим SecureBlackbox (eldos.com/sbb/net-sftp.php) или Rebex.Net.   -  person Eugene Mayevski 'Callback    schedule 20.04.2013


Ответы (8)


Это могло быть что угодно. Вероятные причины:

  • Сборка не может быть найдена
  • Сборка, от которой зависит ваша сборка, не может быть найдена
  • Сборка найдена, но типа в ней нет
  • Статический конструктор типа выдает исключение

Лучше всего использовать программу просмотра журналов Fusion, чтобы помочь в диагностике. Документация здесь:

http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

(К вашему сведению «Fusion» было кодовым названием команды, которая разработала систему загрузки сборок; несколько прискорбно, что кодовое имя оказалось в имени файла поставляемого продукта. Это должно было называться «AssemblyBindingLogViewer.exe» или что-то такое.)

person Eric Lippert    schedule 18.04.2013
comment
Для меня это был статический конструктор, генерирующий исключение. Спасибо. - person Thomas; 17.11.2015
comment
В моем случае библиотеки DLL на целевой машине были старше. После обновления все заработало. - person HGMamaci; 17.02.2017
comment
Моя проблема заключалась в статическом конструкторе типа, который выдает исключение. Я проигнорировал это, пока не увидел ваш ответ. Большое спасибо - person smoothumut; 22.05.2017

Ответ Эрика Липперта прекрасно описывает ситуацию.

Я просто хочу добавить быстрый ответ о случае, который обычно не описывается на страницах справки по этому исключению.

Я создал быстрый и грязный тестовый проект для некоторых вещей с открытым исходным кодом (Akka.Net, чтобы назвать его), и я назвал сам проект «Akka».

Он отлично строится, но при запуске выдает исключение типа load для класса в Akka.dll.

Это просто потому, что мой исполняемый файл (akka.exe) и ссылка (akka.dll) имеют одинаковое имя. Мне потребовалось несколько минут, чтобы понять это (я начал с таких вещей, как локальное копирование, целевая платформа, точная версия и т. Д.).

Это что-то очень глупое, но не обязательно первое, о чем вы подумаете (тем более, что я использовал nuget для зависимостей), поэтому я подумал, что было бы интересно поделиться им: вы столкнетесь с TypeLoadException, если ваш EXE и зависимость имеют одно и то же имя.

person AFract    schedule 25.08.2015
comment
В моем случае это была проблема - основной проект .exe ссылается на другой проект в том же решении, но имя сборки было таким же. Спасибо! - person miki; 24.06.2017
comment
Это наименование вызвало у меня такое же исключение. Я нашел этот ответ и увидел, что уже проголосовал за него, когда именование сделало это со мной год назад! - person Mike; 29.11.2018
comment
В моем случае это тоже было проблемой. Так что пост исправил это для меня. - person Philipp Sch; 12.07.2019

Это почти свело меня с ума ...

Не знаю, как мне это удалось, но по какой-то причине у меня была старая версия DLL в GAC. Попробуйте поискать там старую сборку и удалить.

Удачи!

person Hudson    schedule 22.06.2017
comment
что означает GAC? - person Zapnologica; 28.08.2017
comment
Глобальный кэш сборок - person Hudson; 29.08.2017

Это может быть вызвано множеством причин, как сказано в MSDN:

TypeLoadException возникает, когда среда CLR не может найти сборку, тип в сборке или не может загрузить тип.

Итак, ясно, что тип не может быть найден, либо отсутствует сборка, либо отсутствует тип, либо существует конфликт между конфигурациями среды выполнения.

Иногда проблема может возникнуть из-за того, что сборка, на которую вы ссылаетесь, является платформой другого типа (32-битная / 64-битная и т. Д.), Чем та, с которой вы используете.

Я бы порекомендовал перехватить исключение и изучить его более подробно, чтобы определить, с чем у него проблемы.


В соответствии с моей предыдущей информацией

Иногда я видел, как эта проблема возникает из-за того, что (по той или иной причине) указанная сборка не может быть решена, даже если на нее есть ссылка и она загружена.

Я обычно вижу это, когда речь идет о границах доменов приложений.

Один из способов, который, как я обнаружил, иногда решает проблему (но только если сборка уже находится в домене приложений), - это следующий фрагмент кода:

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
   return AppDomain.CurrentDomain.GetAssemblies()
      .SingleOrDefault(asm => asm.FullName == e.Name);
}

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

person Clint    schedule 18.04.2013

Вы можете получить файлы журнала загрузчика из .NET Compact Framework, включив некоторые параметры в реестре. Power Toys для .NET Compact Framework включает инструмент называется NETCFLogging, который устанавливает для вас значения реестра.

Значения реестра задокументированы здесь:

http://msdn.microsoft.com/en-us/library/ms229650(v=VS.90).aspx

person Mike Dimmick    schedule 30.04.2013

В моем случае проблема заключалась в том, что у меня было два проекта, которые использовали одни и те же библиотеки в одном решении. Я обновил библиотеки DLL только в первом проекте. Поэтому, когда я построил решение, второй проект переопределил его DLL из первого проекта (порядок сборки проекта).

Пример:

Решение:

--MainProject

------ MyDll v5.3.2.0

--Прототип

------ MyDll v5.0.0.0

Проблема исчезла после обновления DLL во втором проекте.

person Mroczny Arturek    schedule 16.11.2017

Убедитесь, что имена (пространства имен, имена классов и т. Д.) Такие, какими они должны быть. Я получил эту ошибку, когда мне пришлось начать работу над своим проектом, я скопировал содержимое моего класса из шаблона и не смог изменить имя класса с «Template Class» на правильное имя (оно должно было соответствовать имени проекта) .

person makesha.laun    schedule 27.06.2018

строковый параметр typeName должен быть полностью определенным именем типа

Например: Activator.CreateInstance ("assemblyFullName", "namespace.typename")

person Eyad Husseini    schedule 22.10.2019