Не удалось загрузить тип из-за ошибки сборки

Я написал следующий простой тест, пытаясь изучить свободный интерфейс Castle Windsor:

using NUnit.Framework;
using Castle.Windsor;
using System.Collections;
using Castle.MicroKernel.Registration;

namespace WindsorSample {
    public class MyComponent : IMyComponent {
        public MyComponent(int start_at) {
            this.Value = start_at;
        }
        public int Value { get; private set; }
    } 
    public interface IMyComponent {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture {
        [Test]
        public void ResolvingConcreteImplShouldInitialiseValue() {
            IWindsorContainer container = new WindsorContainer();
            container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1")));
            IMyComponent resolvedComp = container.Resolve<IMyComponent>();
            Assert.AreEqual(resolvedComp.Value, 1); 
        }
    }
}

Когда я выполняю тест через TestDriven.NET, я получаю следующую ошибку:

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'.
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()

Когда я выполняю тест через графический интерфейс NUnit, я получаю:

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue:
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.

Если я открою сборку, на которую я ссылаюсь в Reflector, я вижу, что ее информация:

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc

и что он определенно содержит Castle.MicroKernel.Регистрация.

Что могло происходить?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
128
0
247 901
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

Ответ принят как подходящий

Находится ли сборка в глобальном кэше сборок (GAC) или в другом месте, где она может переопределять сборку, которая, по вашему мнению, загружается? Обычно это результат загрузки неправильной сборки, для меня это означает, что у меня обычно есть что-то в GAC, заменяющее версию, которая у меня есть в bin / Debug.

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

George Mauer 24.09.2008 05:26

Неважно, как вы ее добавили, если в GAC существует сборка с таким же именем / версией, она загрузится.

Eric Schoonover 24.09.2008 10:12

VS.NET отобразит путь к выбранной вами сборке, и отражатель откроет нужную сборку, но когда приложение выполнит, среда выполнения .NET загрузит сборку GAC.

Eric Schoonover 24.09.2008 10:13

Прошло много времени с тех пор, как я опубликовал эту проблему, но ради сохранения знаний он действительно имел какое-то отношение к переопределению сборок. А именно, я думаю, что использовал Rhino.Mocks, в котором скомпилирована собственная версия замка. Мне пришлось изменить ее, чтобы мой код не ссылался на этот

George Mauer 08.05.2009 21:38

Отлично, это только что устранило мою проблему. Я получал сообщение об ошибке Не удалось загрузить тип Microsoft.Data.Objects.EntityConfiguration`1 из сборки Microsoft.Data.Entity.Ctp, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089. Поэтому я просто удалил EF CTP 4, и все заработало. Ваше здоровье

superlogical 13.08.2010 18:01

Это второй раз, когда этот ответ спас мою задницу. Я бы проголосовал еще раз, если бы мог.

whybird 21.09.2011 05:47

(ГАК. Произнесите это вслух. Сам звук имени предупреждает вас о том, на что это похоже.)

whybird 21.09.2011 05:48

Версия = 1.0.3.0 указывает на Castle RC3, однако свободный интерфейс был разработан через несколько месяцев после выпуска RC3. Таким образом, похоже, что у вас проблема с версией. Возможно, у вас есть Castle RC3, зарегистрированный в GAC, и он его использует ...

Интересно, что я получил последнюю сборку здесь: builds.castleproject.org/cruise/DownloadBuild.castle?number=‌ 956 Это то, что они рекомендовали на своем форуме. Также, если бы это было так, я полагаю, что проект вообще не будет компилироваться. Но это не проблема компилируется

George Mauer 24.09.2008 05:20

Что касается наличия версии в GAC, то, вероятно, у меня есть, но я не добавил ссылку из GAC, и использование отражателя в ссылке указывает на то, что это тот, который я думал

George Mauer 24.09.2008 05:44

Попробуйте удалить дублирующую сборку из GAC, я согласен, это ваша проблема.

Eric Schoonover 24.09.2008 10:14

Если у вас есть один проект, ссылающийся на другой проект (например, тип «Приложение Windows», ссылающийся на «Библиотеку классов»), и оба имеют одинаковое имя сборки, вы получите эту ошибку. Вы можете либо строго указать проект, на который имеется ссылка, либо (что еще лучше) переименовать сборку ссылающегося проекта (на вкладке «Приложение» свойств проекта в VS).

Вдобавок: попробуйте очистить выходную папку. Вероятно, переименование библиотеки может вызвать одну и ту же проблему, потому что обе библиотеки (старая и новая) будут помещены в одну и ту же папку вывода.

Manushin Igor 22.07.2015 00:56

Если вы вырезаете + вставляете проект и неправильно редактируете все поля, это может привести к этой проблеме!

Michael Parker 04.12.2015 20:47

Это было для меня, я уже ссылался на сборку в библиотеке классов, на которую указывает ссылка. Мне пришлось зайти в файл web.config моего веб-проекта и удалить ссылку <dependantAssembly> после удаления пакета в nuGet, чтобы он заработал.

Ivan 04.03.2019 19:33

Я получаю это время от времени, и всегда было не так, чтобы сборка в GAC

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

В итоге у меня была старая ссылка на класс (HttpHandler) в web.config, который больше не использовался (и больше не был действительной ссылкой). По какой-то причине он был проигнорирован во время работы в Studio (или, может быть, этот класс все еще доступен в моей настройке разработчика?), Поэтому я получил эту ошибку только после того, как попытался развернуть в IIS. Я искал имя сборки в web.config, удалил неиспользуемую ссылку на обработчик, затем эта ошибка исчезла, и все отлично работает. Надеюсь, это поможет кому-то другому.

Было что-то очень похожее, с той лишь разницей, что ссылка web.config на DLL все еще была развернута в каталоге bin. Этот двоичный файл, в свою очередь, ссылался на старую версию разделяемой DLL, которая вызвала исключение.

santos 21.05.2019 18:09

Возможно, вы сможете решить эту проблему с помощью перенаправления привязки в * .config. http://blogs.msdn.com/b/dougste/archive/2006/09/05/741329.aspx хорошо обсуждает использование старых компонентов .net в новых фреймворках. http://msdn.microsoft.com/en-us/library/eftw1fys(vs.71).aspx

Я получал эту ошибку, и ничего, что я нашел в StackOverflow или где-либо еще, не решило ее, но ответ бмоэскова на этот вопрос указал мне правильное направление для исправления, о котором еще не упоминалось в качестве ответа. Мой ответ не имеет прямого отношения к исходному вопросу, но я публикую его здесь, исходя из предположения, что кто-то, у кого есть эта проблема, найдет путь здесь через поиск в Google или что-то подобное (например, я через месяц, когда это снова укусит меня , аргу!).

Моя сборка находится в GAC, поэтому теоретически доступна только одна версия сборки. Кроме IIS помогает кэшировать старую версию и выдает мне эту ошибку. Я только что поменял, перестроил и переустановил сборку в GAC. Одно из возможных решений - использовать диспетчер задач, чтобы убить w3wp.exe. Это вынуждает IIS перечитать сборку из GAC: проблема решена.

Обычно это происходит, когда одна версия вашей сборки развернута в GAC, но не была обновлена ​​новыми классами, которые вы могли добавить в сборку в вашей среде IDE. Поэтому убедитесь, что сборка в GAC обновлена ​​с учетом изменений, которые вы могли внести в свой проект.

Например. если у вас есть библиотека классов Common и в этой библиотеке классов у вас есть тип Common.ClassA и разверните его в GAC со строгим именем. Вы приходите позже и добавляете еще один тип, называемый Common.ClassB, и запускаете свой код в своей среде IDE без предварительного развертывания изменений, которые вы внесли в GAC of Common с недавно добавленным типом Common.ClassB.

Просто столкнитесь с этим по другой причине:

выполнение модульных тестов в режиме выпуска, но загружаемая библиотека была версией режима отладки, которая не была обновлена

У меня была такая же проблема, и для меня это не имело ничего общего с пространством имен или именованием проекта.

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

Я рекомендую удалить все "bin" / двоичные папки всех проектов и пересобрать все решение. Это смыло все потенциально устаревшие сборки, и после этого MEF экспортировал все мои плагины без проблем.

Просто столкнитесь с этим по другой причине:

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

Если эта ошибка вызвана изменением пространства имен, убедитесь, что папка этого проекта переименована с тем же именем, и закройте VS.NET Отредактируйте проект, в котором возникла проблема с Блокнотом, и замените там узлы.

"RootNamespace> New_Name_Of_Folder_Of_Your_Project_Namespace" RootNamespace> «AssemblyName> New_Name_Of_Folder_Of_Your_Project_Namespace» AssemblyName>

Папка не имеет значения, но я забыл изменить пространство имен проекта по умолчанию после перемещения и переименования проектов. Спасибо, что указали мне правильное направление.

cdonner 29.12.2020 06:26

Еще одно решение: старые библиотеки DLL, указывающие друг на друга и кэшированные Visual Studio в

C:\Users\[yourname]\AppData\Local\Microsoft\VisualStudio.0\ProjectAssemblies

Выйдите из VS, удалите все в этой папке и ваш дядя Боб.

У меня возникла эта проблема после факторизации имени класса:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

Остановка IIS и удаление содержимого Temporary ASP.NET Files устранили это для меня.

В зависимости от вашего проекта (32/64-битная версия .net и т. д.) Правильный Temporary ASP.NET Files отличается:

  • 64 бит
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 бит
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • На моей машине разработчика это было (возможно, потому, что это IIS Express?)
    %temp%\Temporary ASP.NET Files

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

В любом случае я обновил dll A и получил ошибку от другой библиотеки, на которую указывает ссылка, назовем ее здесь B, где dll A имеет ссылку на dll B.

Обновление dll B устранило проблему.

Я просто решил это, выполнив команду iisreset из командной строки ... Всегда первым делом делаю, когда получаю такие ошибки.

Извините, но это не имеет ничего общего с вопросом, делает предположения об использовании iis и не объясняет, что происходит, чтобы вызвать проблему.

George Mauer 03.04.2015 17:43

Добавление вашей DLL в GAC (глобальный кеш сборок)

Командная строка Visual Studio => Запуск от имени администратора

gacutil / i "путь к файлу dll"

Вы можете увидеть добавленную сборку C: \ Windows \ system32 \

Это также решит проблему отсутствия DLL или «Не удалось загрузить файл или сборку» в задаче сценария SSIS.

Я отмечу, что добавление вещей в GAC обычно является плохой идеей, усложняет развертывание и, как правило, это то, от чего отказывается даже Microsoft.

George Mauer 20.05.2015 19:50

Я была такая же проблема. Я просто решил это, обновив сборку через GAC.

Чтобы использовать gacutil на машине разработки, перейдите по ссылке: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010).

Я использовал эти команды для удаления и переустановки соответственно.

gacutil /u myDLL

gacutil /i "C:\Program Files\Custom\mydllname.dll"

Примечание: я не удалял свою dll, в моем случае я только что обновил dll с текущим путем.

Удаление моего файла .pdb для dll решило эту проблему для меня. Я предполагаю, что это как-то связано с тем, что dll была создана с использованием ILMerge.

Это было для меня! Я не знаю, что такое ILMerge, но Epicor не понравился файл pdb рядом с моей сборкой.

MDave 23.06.2016 20:48

Нет ILMerge, но удаление всех файлов PDB устранило проблему.

hogarth45 21.11.2018 22:02

Когда я сталкиваюсь с такой проблемой, мне очень помогает инструмент FUSLOGVW. Он проверяет информацию о привязке сборки и записывает ее для вас. Иногда библиотеки отсутствуют, иногда у GAC загружаются разные версии. Иногда проблемы возникают из-за платформы ссылочных библиотек. Этот инструмент проясняет, как решаются привязки зависимостей, и это действительно может помочь вам исследовать / отладить вашу проблему.

Fusion Log Viewer / fuslogvw / Assembly Binding Log Viewer. Узнать больше / скачать здесь: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx.

Есть ли способ заставить FUSLOGVW работать с Visual Studio Designer? Visual Studio Designer выдает исключение, когда я пытаюсь отредактировать один из моих диалоговых окон («Метод не найден») для известного мне метода (приложение работает нормально). Насколько я понимаю, при редактировании чего-либо в Visual Studio Designer в FUSLOGVW ничего не отображается.

Jimmy 28.06.2018 22:29

Возможно, это не так вероятно, но для меня это было вызвано тем, что мое приложение пыталось загрузить библиотеку с тем же именем сборки (xxx.exe загружает xxx.dll).

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

Поскольку я уверен, что тип не изменился в обеих версиях сборки, я создал настраиваемый преобразователь сборок, который сопоставляет отсутствующую сборку с той, которую мое приложение уже загрузило. Самый простой способ - добавить в класс программы статический конструктор следующим образом:

using System.Reflection
static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "<AssemblyName>")
        {
            // Load assembly from startup path
            return Assembly.LoadFile($"{Application.StartupPath}\<AssemblyName>.dll");
        }
        else
        {
            return null;
        }
    };
}

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

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

JBartlau 31.08.2018 16:33

У меня возникла аналогичная проблема в Visual Studio 2017 с использованием MSTest в качестве среды тестирования. Я получал исключения System.TypeLoadException при запуске некоторых (не всех) модульных тестов, но эти модульные тесты проходили при отладке. В конечном итоге я сделал следующее, что решило проблему:

  1. Откройте файл Local.testsettings в решении.
  2. Зайдите в настройки "Unit Test"
  3. Снимите флажок «Использовать контекст загрузки для сборок в тестовом каталоге». флажок

После выполнения этих шагов все модульные тесты начали проходить при запуске.

Я испытал то же самое, что и выше, после удаления подписи сборок в решении. Проекты строить не будут.

Я обнаружил, что один из проектов ссылается на пакет StrongNamer NuGet, который изменяет процесс сборки и пытается подписать неподписанные пакеты NuGet.

После удаления пакета StrongNamer я смог снова собрать проект без подписи / строгого именования сборок.

Если это приложение для Windows, попробуйте проверить наличие дубликата в глобальном кэше сборок (GAC). Что-то отменяет вашу версию bin / debug.

Если это веб-приложение, вам может потребоваться удалить его на сервере и повторно загрузить. Если вы публикуете, вы можете установить флажок Удалить все существующие файлы перед публикацией. В зависимости от версии Visual Studio он должен находиться в Publish> Settings> File Publish Options. Delete all existing files prior to publish

Хочу отметить еще несколько моментов и сделать вывод.

Обычно, как объяснили другие, это исключение возникает, когда возникает проблема с загрузкой ожидаемого типа (в существующей сборке) во время выполнения. Более конкретно: всякий раз, когда загруженная сборка устарела (и не содержит требуемый тип). Или когда уже загружена сборка с другой версией или сборкой, которая не содержит ожидаемого типа.

Кроме того, я должен упомянуть, что это кажется редким, но возможно ограничение времени выполнения или ошибка компилятора (предположим, что компилятор не отрицает что-то и просто скомпилировал проблемный код), но среда выполнения выдает исключение System.TypeLoadException. Да; это действительно произошло со мной!

Пример (ведьма пришла мне в голову)

Рассмотрим struct, который определяет внутри себя поле, допускающее значение NULL, собственного типа. Определение такого поля, не допускающего значения NULL, приведет к ошибке времени компиляции и предотвратит сборку (очевидно, такое поведение имеет логическую причину). Но как насчет заполненной структуры, допускающей значение NULL? Фактически, типы значений, допускающие значение NULL, находятся позади Nullable<T>. Поскольку компилятор C# не помешал мне определить это таким образом, я попробовал его, и проект был построен. Но я получаю исключение времени выполнения System.TypeLoadException: 'Could not load type 'SomeInfo' from assembly ... ', и, похоже, проблема с загрузкой части моего кода (в противном случае мы можем сказать: по крайней мере, компилятор не полностью выполнил процесс компиляции) для меня в моей среде:

public struct SomeInfo
{
   public SomeInfo? Parent { get; } 
   
   public string info { get; }
}

Характеристики моей среды:

  • Visual Studio 2019 16.4.4
  • Версия языка: C# 7.3
  • Тип проекта: библиотека netstandard 2.0.3
  • Время выполнения: классический DotNetFramework 4.6.1

(Я проверил и убедился, что скомпилированная сборка обновлена ​​и действительно скомпилирована заново. Я даже выбросил весь каталог bin и обновил весь проект. Даже я создал новый проект в новом решении и протестировал, Но такая структура генерирует исключение.)

Кажется, это ограничение времени выполнения (логически или технически) или ошибка или такая же проблема, потому что Visual Studio не мешает мне компилировать И также другие новые части моих кодов (за исключением этой структуры) работают нормально. При изменении struct на class скомпилированная сборка также содержит и выполняет тип.

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

Заключение

Проверьте ситуации:

  • Когда такая же (возможно, более старая) сборка уже существует в GAC, которая переопределяет указанную сборку.

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

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

  • Когда несоответствующая конфигурация вызвала требование к несуществующему типу с помощью настраиваемого инструмента или промежуточного программного обеспечения или стороннего исполняемого файла, который загружает сборку, и возникает необходимость обновить конфигурацию или очистить что-то (например, удаление обработчика http в файле web.config в IIS развертывание, как сказал @ Brian-Moeskau)

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

Другие вопросы по теме