Не удалось загрузить файл или сборку System.IO.FileSystem

Я использую .NET Standard 1.3 и .NET Framework 4.6.

Самое главное, я пытаюсь получить доступ к этим классам из System.IO.FileSystem:

Directory class (i.e. Directory.Delete();)
File class (i.e. File.Exists();)
FileInfo class (i.e. FileInfo fi = new FileInto();)

Но я всегда получаю такие ошибки, как:

Не удалось загрузить файл или сборку System.IO.FileSystem, Version = 4.0.1.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a или одну из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Я установил System.IO.FileSystem 4.3.0 для библиотек .NET Standard 1.3.

Я пробовал удалить файлы bin, очистить, перестроить, восстановить пакеты nuget, отредактировать файл .csproj и т. Д. Nada.


person susieloo_    schedule 31.07.2017    source источник
comment
Это базовые классы, которые присутствуют во всех версиях System.IO. У вас есть более приземленная проблема, когда ваша сборка неправильно сконфигурирована, например, ссылка на сборки, которые не соответствуют вашей платформе (которые затем косвенно ссылаются на System.IO). Сборки .NET Framework не совпадают с версиями этих сборок .NET Standard; в этом смысле они не эквивалентны, и вы не можете смешивать и сочетать. Проект .NET Standard должен ссылаться только на сборки .NET Standard.   -  person Jeroen Mostert    schedule 31.07.2017
comment
Спасибо за ответ, @JeroenMostert! Так будет ли это работать, если в моем классе .NET Framework A () я создам объект из моего класса .NET Standard B (), который вызывает метод b.Delete (); (который он вызывает Directory.Delete ();)? Это примерно то же самое, что и моя текущая логика прямо сейчас.   -  person susieloo_    schedule 01.08.2017
comment
Да, базовая настройка должна работать. Учитывая сообщение об ошибке, кажется вероятным, что что-то в вашем проекте заканчивается жесткой (несовместимой) ссылкой на версию 4.0.1 пакета System.IO.FileSystem, когда установлена ​​4.3.0. Однако установить точную причину на расстоянии сложно. Разрешение зависимостей NuGet, как известно, сложно. Часто он не будет автоматически делать правильные вещи в отношении версий в разных проектах.   -  person Jeroen Mostert    schedule 01.08.2017
comment
Используйте перенаправление сборки в app.config, чтобы решить эту проблему. Это не имеет ничего общего с поверхностью API. Кроме того, если вы не используете сборки на основе .NET Standard, вам даже не нужно добавлять ссылку на System.IO.FileSystem.   -  person Lex Li    schedule 01.08.2017
comment
@LexLi Я пробовал перенаправление сборки. Тоже не работает: \   -  person susieloo_    schedule 01.08.2017
comment
@susieloo_ вы должны проверить версию файла в папке bin перед написанием правила перенаправления. Должно быть 4.0.2.0.   -  person Lex Li    schedule 01.08.2017
comment
@LexLi Не повезло :( 4.3.0.0 действительно существует в папке bin (это версия, которую я хочу). Каким-то образом при добавлении пакетов nuget он добавил 4.0.2.0, но с 4.3.0.0 HintPath. Я сделал перенаправление и изменилось также попыталось изменить версию, чтобы она соответствовала.   -  person susieloo_    schedule 01.08.2017
comment
@LexLi Я опубликовал HintPaths в качестве редактирования, если это дает вам лучшее представление о ситуации.   -  person susieloo_    schedule 01.08.2017
comment
Больше мне ничего не известно о вашей ситуации. На моем компьютере работает перенаправление на 4.0.2.0, поэтому я не буду больше комментировать. Вы должны помочь себе на этом этапе.   -  person Lex Li    schedule 01.08.2017
comment
Не уверен, что вы уже проверили, но это могут быть 2 возможных сценария: 1. проверьте файлы конфигурации (приложение, веб или пакеты) и посмотрите, какая версия указана 2 ...... или одна из ее зависимостей одна из decencies / файлы библиотеки, которые использует FileSystem, могут иметь неправильную версию   -  person DaniDev    schedule 02.08.2017


Ответы (2)


Удалите ссылку в разделе "Ссылки".

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

Еще один шаг по устранению неполадок - открыть файл проекта как XML и найти тег Reference. Обычно существует HintPath, подобный этому, который укажет вам на проблемный пакет или жесткую ссылку. (Под "нарушением" я подразумеваю позволить нам определить, где обнаруживается сборка, которая является неправильной несовместимой версией)

<HintPath>..\packages\Microsoft.Bcl.1.1.10\lib\net40\System.IO.dll</HintPath>

Вот как вы обнаружите плохой жестко запрограммированный путь в результате того, что кто-то использует опцию «Обзор» при добавлении сборки, что является плохой практикой при работе со сборками BCL.

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

Очистить + перестроить, и он должен быть сломан, потому что нет ссылки на сборку.

На этом этапе я убрал плохую ссылку. Раньше я использовал Add Reference -> и выбирал из раздела Framework. Это в основном ссылка GAC.

В эти дни я теперь получаю соответствующий пакет nuget, который должен добавить правильную ссылку на основе вашей целевой платформы, вы можете явно выбрать версию сборки, которую хотите, просто убедитесь, что все связанные проекты в вашем решении используют одну и ту же версию, чтобы избежать проблемы: https://www.nuget.org/packages/System.IO/

Это может быть сложно решить, потому что часто это не официальный пакет для вашей отдельной сборки, а содержится в более крупном пакете с именем вроде Microsoft.BCL или Microsoft.AspNet.WebAPI.Client (который я использовал для получения сборок Http ). Это то, что я считаю наиболее сложным, но похоже, что ссылка выше должна предоставить вам конкретную версию, которая вам нужна (надеюсь).

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

В наши дни большинство из них загружаются через пакет nuget, чтобы синхронизировать версии во всех ваших связанных проектах. Честно говоря, я не понимаю, почему классы BCL втягиваются через Nuget сейчас, когда они являются частью установленного фреймворка, но именно так, кажется, все делается сейчас, и как я заставляю их работать последовательно.

person AaronLS    schedule 31.07.2017
comment
Сегодня я проделал эти шаги миллиард раз, прежде чем опубликовать на SO. Я только что сделал это еще раз и внимательно следил за вашими инструкциями, чтобы не пропустить ни одного шага, но, к сожалению, это все еще не работает. :( Я очень ценю ваши старания! - person susieloo_; 01.08.2017
comment
Что показывает ваш путь подсказки для сборки в XML проекта? (Проверьте все проекты в решении, чтобы убедиться, что они одинаковы.) - person AaronLS; 01.08.2017
comment
Извини, я возвращаюсь с работы домой. Я вернусь к вам, как только вернусь! Хотя у меня там около 300 проектов. Я просто использовал диспетчер Nuget, чтобы сообщить мне, установлен ли какой-либо из System.IO.FileSystem в каком-либо одном проекте, и я удалил его из всех, которые были установлены (что было только в двух проектах, с которыми я сейчас работаю. ). - person susieloo_; 01.08.2017
comment
Я совершенно не понял, что вы сказали. Я думал, вы сказали мне проверить каждый отдельный файл проекта. Я просто добавил HintPaths из решения в качестве редактирования сообщения. - person susieloo_; 01.08.2017
comment
Тот факт, что версия, созданная путем добавления через Nuget Manager, указывает на 4.0.2.0, но путь указывает на 4.3.0.0 ... означает ли это, что версия моего GAC не обновлена ​​/ неверна? - person susieloo_; 01.08.2017

В моем случае я создал тестовый проект (скажем, проект A) для моего фактического проекта (проект B). Когда я запускаю тесты, проект A строится успешно, но когда я запускаю тесты, я столкнулся с аналогичной ошибкой. System.IO.Ports был установлен в проекте B, но не в тестовом проекте A.

Проблема, решенная путем установки пакета System.IO.Ports в обоих проектах, решила проблему.

person Nuryagdy Mustapayev    schedule 22.01.2021